2010-11-04 132 views
4

使用實體框架4我想爲我的對象創建一個基本接口,以便基類接口的屬性作爲表中的字段實現爲每個派生類(不在其自己的表中),並且然後使用接口處理派生類。實體框架中的接口繼承

例如,有一個接口和一些類,像這樣:

public interface IBaseEntity 
{ 
    public DateTime CreatedOn { get; set; } 
    public string CreatedBy { get; set; } 
} 

public class SomeEntity : IBaseEntity 
{ 
    public int SomeEntityId { get; } 
    public string Name { get; set; } 
    public DateTime CreatedOn { get; set; } 
    public string CreatedBy { get; set; } 
} 

public class OtherEntity : IBaseEntity 
{ 
    public int OtherEntityId { get; } 
    public float Amount { get; set; } 
    public DateTime CreatedOn { get; set; } 
    public string CreatedBy { get; set; } 
} 

這將導致在數據庫中,和SomeEntity OtherEntity,這將對每個四個字段兩個表。 SomeEntity具有SomeEntityId,Name,CreatedOn和CreatedBy,而OtherEntity具有OtherEntityId,Amount,CreatedOn和CreatedBy。沒有IBaseEntity表。

我期望在設計器中看到這一點,因爲IBaseEntity是具有CreatedOn和CreatedBy屬性的抽象實體,兩個具體實體只具有它們的非派生屬性 - 所以SomeEntity只具有SomeEntityId和Name。在具體實體和抽象實體之間存在着繼承關係。

然後我想有automatic column updates這些對象保存它們的時候,就像這樣:

namespace MyModel 
{ 

    public partial class MyEntities 
    { 
     partial void OnContextCreated() 
     { 
      this.SavingChanges += new EventHandler(OnSavingChanges); 
     } 

     private static void OnSavingChanges(object sender, EventArgs e) 
     { 
      var stateManager = ((MyEntities)sender).ObjectStateManager; 
      var insertedEntities = stateManager.GetObjectStateEntries(EntityState.Added); 

      foreach (ObjectStateEntry stateEntryEntity in insertedEntities) 
      { 
       if (stateEntryEntity.Entity is IBaseEntity) 
       { 
        IBaseEntity ent = (IBaseEntity)stateEntryEntity.Entity; 
        ent.CreatedBy = HttpContext.Current.User.Identity.Name; 
        ent.CreatedOn = DateTime.Now; 
       } 
      } 
     } 
    } 
} 

我剛開始接觸實體框架和它看起來這應該可以很容易地被公平進行,但如何真正實現它正在逃避我。我在這裏偏離軌道還是在Entity Framework 4中可能會出現這種情況?每個具體類型策略表看起來像解決方案,但我一直無法得到它的工作。

+0

以防萬一[類型是否實現了接口](http://www.hanselman.com/blog/DoesATypeImplementAnInterface.aspx) – tschmit007 2013-02-04 14:53:44

回答

3

該接口不會成爲實體模型的一部分,並且無法在設計器中顯示。但是你可以通過一個分類來添加它,然後你的代碼就可以工作。我們實際上爲此使用了T4模板,但手動完成後也能正常工作。

+0

哇,從老德爾福的日子似曾相識!也許我問的是錯誤的問題,而界面並不是這樣做的方法。我想要的是一種繼承的方式,以便我的表理解他們必須從父級實現字段。因此,它們具有CreatedBy和CreatedOn,但我可以將其他字段添加到父級,例如ModifiedBy和ModifiedOn,並且所有後代表現在都知道也可以實現這些字段。能夠通過接口與所有類一起工作肯定也是有益的,但最初我想要某種表格模板。 – 2010-11-04 22:48:12

1

那麼,這是相當古老的,但我想我會提到,你可以通過抽象類來完成原始海報想要的內容,以及接受答案者所建議的方式。

+0

這是真的,但由於C#不支持類的多重繼承,使用有限。在這種情況下,OP正在爲審計數據創建一個接口,這不太可能是您希望層次結構中的每個類都支持的內容。 – 2015-06-09 09:28:53

+0

你不可能有一次同時從多個類繼承的「多重繼承」,但你當然可以有多層次的繼承並完成OP想要的方式。有時候需要接受答案的建議(我有時會這麼做),有時候會使用抽象類。只是在工具箱中的兩個不同的工具:) – Eric 2015-06-10 14:13:39