2015-12-22 78 views
1

我正在使用Code first方法處理MVC應用程序。我創建了一個名稱爲IEntityBase的通用接口。我已經定義了將在所有表格中使用的基本列。我想將默認值分配給某些列,以便在它將創建新行時默認分配這些值。正如我們可以在每個類構造函數中定義的那樣,但是我想將它們指定爲泛型,以便如果將來添加任何新列,那麼我可以執行此操作。
我可以爲此使用IOC嗎?爲某些變量設置默認值的多接口實現

例如

public interface IEntityBase 
{ 
    int ID { get; set; } 
    bool IsActive { get; set; } 
    bool IsDeleted { get; set; } 
    DateTime? Created { get; set; } 
    string CreatedBy { get; set; } 
} 

上述接口是由具有5列的接口。我想將默認值IsActive分配爲true,IsDeleted爲False並創建爲今天的日期。

請幫我解決這個問題。

+0

嘗試定義一個基類來代替。 – Steven

+0

接口定義了一個契約,而不是一個實現。類定義實現。正如@Steven所說的,你需要使用每個東西都繼承的基類。將其抽象以避免EF將其作爲STI實施。 –

回答

0

假設這些都是你的EF POCO領域類,你可以在初始化推到你的數據庫環境的覆蓋SaveChanges

public class MyCustomDbContext : DbContext 
{ 
    public override int SaveChanges() 
    { 
     EntityState[] states = 
      new EntityState[] { 
       EntityState.Added, EntityState.Deleted, EntityState.Modified }; 

     // get all addded/deleted/modified entries 
     foreach (var entry in ChangeTracker.Entries()) 
     { 
      if (entry.Entity is IEntityBase && 
       states.Any(s => s == entry.State) 
       ) 
      { 
       IEntityBase e = (IEntityBase)entry.Entity; 

       // some properties are always set 
       e.ModifiedDate = DateTime.Now; 

       // other properties are set only for 
       // entities in specific state 
       if (entry.State == EntityState.Added) 
       { 
        e.CreatedDate = DateTime.Now; 
       } 
      } 
     } 
     // save changes 
     return base.SaveChanges(); 
    } 
} 
+0

對於這個特定的用例(更新創建/修改日期),這實際上是一個很好的解決方案,但是應該注意的是,在任何其他通用屬性上實現「默認」值都是一個糟糕的解決方案。 –