EntityFramework's версия Callbacks и NamedScope Activerecord - PullRequest
2 голосов
/ 27 декабря 2011

Проблема: в моей модели мне нужно использовать обратные вызовы для обработки объекта сущности db до того, как произойдет какое-либо событие ORM. Кроме того, я ищу способ применения named-scope , поэтому мне не нужно указывать определенные условия для каждого запроса. Для примера; когда я использую Find для объекта dbcontext для Items, мне не нужно упоминать active = true для каждого вызова.

Вопросы:

  1. Есть ли что-нибудь сопоставимое с методами обратных вызовов ActiveRecord в ASP.NET MVC (EntityFramework)? Например: after_save, before_save, after_create, before_create, after_validation, before_validation и т. Д.

  2. Должен ли я создать «представление модели» для добавления каждого запроса с обязательными условиями? Пожалуйста, предоставьте пример или ресурс / учебник.

1 Ответ

6 голосов
/ 27 декабря 2011

Нет.Нет доступных событий / обратных вызовов.EF ObjectContext предлагает только ObjectMaterialized и SavingChanges события.Первый может использоваться для реагирования, когда сущность материализуется (загружается) из базы данных, а второй может использоваться для обработки чего-либо до сохранения изменений (это похоже на переопределение SaveChanges метода).

Пример:

public void SavingChanges(object sender, EventArgs e)
{
    ObjectContext context = (ObjectContext)sender; 

    var entities = context.ObjectStateManager
                          .GetObjectStateEntries(EntityState.Added)
                          .Where(e => !e.IsRelationship)
                          .Select(e => e.Entity)
                          .OfType<MyEntity>();

    // Now you have all entities of type MyEntity which will be added
    // You can use similar approach for other type of entities or
    // modified entities or deleted entities                      
}

EF не предлагает каких-либо глобальных условий / именованных областей.Вы всегда должны убедиться, что ваш запрос содержит все условия.Например, вы можете создать собственный метод расширения и вместо значения по умолчанию Find использовать тот метод расширения, который добавит все ваши дополнительные условия

Пример:

public static MyEntity FindWithCondition(this IQueryable<MyEntity> query, int id)
{
    return query.Where(...).FirstOrDefault(e => e.Id == id);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...