2010-09-17 69 views
3

我有幾個類從一個抽象基類繼承,它包含一些常用的實用程序代碼。我想移動到EF來訪問數據,但我仍然希望對象能夠繼承基類中的通用代碼。 EF類已經從EntityObject繼承,所以我不能讓它們繼承我的基類。什麼是正確的方式來處理這個問題?我的環境是Net 3.5/C#如何獲得實體框架類繼承基類

回答

5

對不起,如果你看到我以前的帖子 - 我錯過了一些重要的問題。

您可以使用部分類。讓你的部分類有一個內部字段,並帶有你想要的基類實例,並實現所有的方法和屬性(除非它們已經在實體中實現)。如果您嘗試允許使用您的實體類,則可以在您的基類(或部分實體類中)中使用public static implicit operator,以便無障礙地進行轉換。

如果你有一個叫做MyBaseClass一個抽象基類,你可以這樣做:

public partial class MyEntityClass 
{ 
    private MyBaseClass _baseClass; 

    private MyBaseClass BaseClass 
    { 
     get 
     { 
      if (_baseClass == null) 
      { 
       _baseClass = new MyBaseClass(); 
      } 
      return _baseClass; 
     } 
    } 

    public string BaseClassString 
    { 
     get 
     { 
      return BaseClass.BaseClassString; 
     } 
     set 
     { 
      BaseClass.BaseClassString = value; 
     } 
    } 

    // etc. 

    public static implicit operator MyBaseClass(MyEntityClass e) 
    { 
     return new MyBaseClass() { 
      Property1 = e.Property1, 
      Property2 = e.Property2 // etc. 
     }; 
    } 

    public static implicit operator MyEntityClass(MyBaseClass b) 
    { 
     return new MyEntityClass() { 
      Property1 = b.Property1, 
      Property2 = b.Property2 // etc. 
     }; 
    } 
} 
2

如果你仍然在使用Visual Studio 2008,我不確定你能否做到這一點(儘管有人請隨時糾正我)。

但是,如果您使用VS2010,那麼您可以使用新的T4模板選項(即使在定位.net 3.5時)。我會做的是讓你的基類從EntityObject類繼承,然後修改用於生成從你的基類繼承的類的t4模板。

如果你仍然在VS2008中,你可能仍然會做同樣的事情,你只需要手動修改生成的CS文件(每次你改變你的模型),哪些將被認爲是可怕的。

+0

我的解決方案,同時有點乏味,確實在VS2008的工作,你不需要改變任何生成的代碼。感謝提示,儘管 - 在VS2010中更好! – Andrew 2010-09-17 19:18:09

+0

@Andrew:是的,這是一個非常有趣的方法。然而,如果你有一個擁有100個實體的模型,那麼單調乏味的描述就會輕描淡寫。雖然,您也可以使用T4模板或CodeSmith模板來生成部分實體。 – CodingGorilla 2010-09-17 19:33:20