Очень хороший вопрос, и да, в EF4 есть идеальный способ сделать это:
Пользовательские свойства - это способ предоставления вычисляемых свойств сущностям,Хорошая новость заключается в том, что пользовательские свойства не обязательно нужно вычислять из других существующих свойств той же самой сущности. По коду, который мы собираемся увидеть, они могут быть вычислены из всего, что нам нравится!
Вот шаги:
Сначала создайте частичный класс и определите для него настраиваемое свойство (Для простоты я предположил, что User_User таблица была сопоставлена с классом User и Util_Login to Util)
public partial class User {
public DateTime LastLoginDate { get; set; }
}
Итак, как вы можете видеть здесь, вместо создания свойства LastLoginDate в модели, которое потребуется для сопоставления с хранилищем данных, мысоздали свойство в частичном классе, и затем мы можем заполнить его во время материализации объекта или по требованию , если вы неНе верьте, что каждый объект сущности должен будет предоставить эту информацию.
В вашем случае предварительный расчет пользовательского свойства LastLoginDate для каждого материализуемого пользователя полезен, так как я думаю, что это значение будет доступно для всех (или, по крайней мере, для большинства) изсущности материализуются.В противном случае вам следует рассмотреть возможность расчета свойства только по мере необходимости, а не во время материализации объекта.
Для этого мы собираемся использовать Событие ObjectContext.ObjectMaterialized , которое вызывается каждый раз, когда данные возвращаются из запроса, поскольку ObjectContextсоздание объектов объектов из этих данных.Событие ObjectMaterialized - это вещь Entity Framework 4.Поэтому все, что нам нужно сделать, это создать обработчик события и подписать его на событие ObjectMaterialized.
Лучшее место для размещения этого кода (подписка на событие) - метод OnContextCreated .Этот метод вызывается конструктором объекта контекста и перегружает конструктор, который является частичным методом без реализации, это просто сигнатура метода, созданная генератором кода EF.
Хорошо, теперь вам нужно создать частичный класс для вашего ObjectContext.(Я предполагаю, что имя UsersAndLoginsEntities ) и подписываю обработчик событий (я назвал его Context_ObjectMaterialized ) на ObjectMaterialized Event .
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);
}
}
Надеюсь, это поможет.