2012-07-04 3 views
3

Я использую EF 4.3.1 Мне нужно добавить значение по умолчанию объекта в момент сохранения.Override DbContext SaveChanges

В данный момент я использую SaveChanges(), и он работает.

Как вы можете видеть из кода, я использую ChangeTracker.Entries<Option>() где Option rappresent a specificc DataType.

Я хотел бы знать, если это возможно и как написать более общую версию ChangeTracker.Entries что-то вроде ChangeTracker.Entries<t>(), чтобы он мог проверять все типы объектов в моей модели, как вы можете видеть в моем конкретном случае. У меня есть Примечание Внутреннее свойство на многих классах

 public override int SaveChanges() 
    { 
     #region Option BL 
     var entities = ChangeTracker.Entries<Option>() 
            .Where(e => e.State == EntityState.Added || 
               e.State == EntityState.Modified) 
            .Select(e => e.Entity); 
     // Add Default values when Creating or Editing an Entity 
     string defaultvalue = ""; 
     foreach (var entity in entities) 
     { 
      if (String.IsNullOrWhiteSpace(entity.NoteInternal)) 
       entity.NoteInternal = defaultvalue; 
     } 
     #endregion 

     return base.SaveChanges(); 
    } 

Благодарим за помощь!

PS: Используется ли здесь тип DYNAMIC Datamype?

ответ

4

я могу думать о трех вариантах:

  1. Использование отражения, чтобы проверить, если каждый элемент имеет свойство NoteInternal. Это медленно.
  2. Используйте dynamic, чтобы попытаться получить доступ к собственности NotIntenral каждого элемента. Вы должны проверить и обработать исключение, возникшее, когда объект не имеет свойства.
  3. Сделайте интерфейс IHasNoteInternal, который определяет свойство и имеет все объекты, у которых свойство реализует этот интерфейс. Затем введите все записи IHasNoteInternal.

Я думаю, что вариант 3. является лучшим и дает лучший дизайн, но он требует от вас изменения сущностей, которые могут быть или могут быть недоступны. Я не знаю, можете ли вы использовать общий метод Entries<TEntity>() для получения измененных объектов - он может не соответствовать объектам на основе интерфейса. В этом случае используйте не общий код Entries() и используйте оператор linq OfType<T>(), чтобы отфильтровать соответствующие записи.

var hasNotInternal = ChangeTracker.Entries() 
        .Select(e => e.Entity).OfType<IHasNotInternal>(); 
+0

Вы могли бы предоставить мне образец кода для записей() и использование LINQ-х OfType () ???? – GibboK

+0

Добавлен фрагмент кода в качестве редактирования. –

+0

Спасибо, я очень ценю это! – GibboK

1

Сделайте свои записи наследуемыми от интерфейса, реализующего свойство NoteInternal.

создать класс расширения

public static class DbChangeTrackerExtensions { 
public static IEnumerable<T> TypedEntries<T>(this DbChangeTracker tracker) { 
    return tracker.Entries().OfType<T>(); 
} 

Тогда вы можете назвать его прохождения в этом интерфейсе.

Или, если изменения объектов не представляется возможным

var name="NoteInternal"; 

var entities = ChangeTracker.Entries() 
           .Where(e => e.State == EntityState.Added || 
              e.State == EntityState.Modified) 
           .Where(e => e.CurrentValues.Any(c=>c.Name==name && string.IsNullOrWhiteSpace((string)c.CurrentValue))); 
    // Add Default values when Creating or Editing an Entity 
    string defaultvalue = ""; 
    foreach (var entity in entities) 
    { 
     entity.Property(name).CurrentValue=defaultvalue; 
    } 
Смежные вопросы