2012-04-09 5 views
0

У меня есть пара моделей, связанных с DbContext. Как я могу переопределить SaveChanges, чтобы сделать что-то другое на основе сохраненной модели?Entity Framework DbContext Override SaveChanges для каждой модели

Например, у меня есть две модели: Document и Paragraph. Как я могу переопределить SaveChanges, так что каталог создается при добавлении Document и что файл создается при добавлении Paragraph.

Вот моя попытка сделать это до сих пор.

public int override SaveChanges() 
{ 
    ChangeTracker.DetectChanges(); 

    var context = ((IObjectContextAdapter)this).ObjectContext; 
    var stateEntries = context.ObjectStateManager.GetObjectStateEntries(
     EntityState.Added 
     | EntityState.Modified 
     | EntityState.Deleted 
    ).ToList(); 

    foreach (var entry in stateEntries) 
    { 
     if (!entry.IsRelationship) 
     { 
      switch (entry.State) 
      { 
       case EntityState.Added: 
        break; 

       case EntityState.Modified: 
        break; 

       case EntityState.Deleted: 
        break; 
      } 
     } 
    } 

    return base.SaveChanges(); 
} 

ответ

2

Элемент имеет Entity свойство, которое хранит экземпляр вашего обработанного объекта, так что вы можете проверить тип экземпляра и теоретически делать то, что логика вы хотите сделать.


Вы не должны использовать SaveChanges делать ничего, кроме обработки ваших объектов по стойкости к базе данных - что нарушает разделение проблем. Контекст - это адаптер между вашей логикой приложения и базой данных - ничего больше. Более того, эта идея интеграции операций файловой системы с операциями с базой данных требует гораздо более сложной и тщательной обработки, чтобы решить ситуацию, когда какая-либо операция завершается с ошибкой. В вашем текущем сценарии любой сбой при вызове base.SaveChanges приведет к появлению в вашей файловой системе каталогов или файлов-сирот - вам необходимо использовать транзакционную файловую систему и запустить, но работать с базой данных и файловой системой в одной транзакции, или вы должны выполнить компенсацию вручную файловой системы.

Еще одна проблема с вашим кодом является то, что вы должны обрабатывать Document экземпляры до Paragraph, чтобы убедиться, что каталоги создаются, прежде чем вы хотите вставить файлы и т.д. Просто эта логика не принадлежит SaveChanges метод и не должен вызываться от SaveChanges способ.

Смежные вопросы