Ответ 1
Очень хороший вопрос, и да, есть отличный способ сделать это в EF4:
Пользовательские свойства - это способ предоставления вычисленных свойств сущностям. Хорошей новостью является то, что пользовательские свойства необязательно должны быть рассчитаны из других существующих свойств на одном и том же объекте, по коду, который мы собираемся увидеть, они могут вычисляться из всего, что нам нравится!
Вот шаги:
Сначала создайте частичный класс и определите на нем настраиваемое свойство (для простоты я предположил, что таблица User_User сопоставлена с классом User и Util_Login для Util)
public partial class User {
public DateTime LastLoginDate { get; set; }
}
Итак, как вы можете видеть здесь, вместо того, чтобы создавать свойство LastLoginDate в модели, которое требуется для отображения обратно в хранилище данных, мы создали свойство в частичном классе, а затем у нас есть возможность заполнить он во время материализации материализации или по запросу, если вы не считаете, что каждый объект объекта должен будет предоставить эту информацию.
В вашем случае предварительное вычисление пользовательского свойства LastLoginDate для каждого материализованного Пользователя полезно, так как я думаю, что это значение будет доступно для всех (или, по крайней мере, большинства) материализуемых объектов. В противном случае вы должны рассмотреть возможность расчета свойства только по мере необходимости, а не во время материализации объекта.
Для этого мы будем использовать ObjectContext.ObjectMaterialized Event, который поднимается в любое время, когда данные возвращаются из запроса, поскольку ObjectContext создает объекты сущности из этих данных. Событие ObjectMaterialized - это объект Entity Framework 4.
Итак, все, что нам нужно сделать, это создать обработчик событий и подписаться на событие ObjectMaterialized.
Лучшее место для размещения этого кода (подписка на событие) находится внутри метода OnContextCreated. Этот метод вызывается конструктором контекстных объектов и конструктором
перегрузки, который является частичным методом без реализации, просто сигнатурой метода, созданной генератором кода EF.
Итак, теперь вам нужно создать частичный класс для ObjectContext. (Я предполагаю, что это имя UsersAndLoginsEntities) и подписаться на обработчик событий (я назвал его Context_ObjectMaterialized) объектно-материализованным событием.
public partial class UsersAndLoginsEntities {
partial void OnContextCreated() {
this.ObjectMaterialized += Context_ObjectMaterialized;
}
}
Последним шагом (реальной работой) было бы реализовать этот обработчик для фактического заполнения пользовательского свойства для нас, что в этом случае очень просто:
void Context_ObjectMaterialized(object sender, ObjectMaterializedEventArgs args)
{
if (args.Entity is User) {
User user = (User)args.Entity;
user.LastLoginDate = this.Utils
.Where(u => u.UserID == user.UserID)
.Max(u => u.LoginDate);
}
}
Надеюсь, это поможет.