2012-07-04 119 views
3

我使用EF 4.3.1我需要在保存時添加一個實體的默認值。覆蓋DbContext SaveChanges

目前我正在使用SaveChanges(),它的工作原理。

正如您從代碼中看到的,我使用ChangeTracker.Entries<Option>(),其中Option表示特定的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數據類型是否合理?

回答

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; 
    }