2012-02-15 57 views
1

我使用EF 4.2(數據庫優先)與DBContext T4模板創建我的POCO類。這個作品非常好,但現在我stumpled了一個問題,有一個抽象基類:實體框架4 + DBContext T4 +抽象基類

我需要我的T4生成POCO類從具有抽象屬性的自定義抽象類繼承:

//my abstract base class (shortened) 
public abstract class BaseClass { 
    public abstract int? Property1 { get; set; } 
    public abstract int? Property2 { get; set; } 

    // a lot of methods that work with above properties 
} 

//my T4 generated entity (shortened) 
public partial class Entity { 
     public Nullable<int> Property1 { get; set; } 
     public Nullable<int> Property2 { get; set; } 
} 

//and a partial class to make the T4 entity inherit from my abstract class 
public partial class Entity : BaseClass { 
} 

我的問題是編譯器不會構建它,因爲T4類中的屬性沒有標記爲「覆蓋」。 LINQ 2 SQL可以選擇更改實體屬性的繼承修飾符,但在EF模型設計器中找不到此選項。

有沒有辦法告訴EF模型設計器和T4模板將某些屬性標記爲覆蓋(當然,我可以更改生成的C#代碼,但當T4再次運行時,這些更改會被覆蓋)?有沒有其他的方法可以使這個編譯&工作?

非常感謝, 〜saxx


更新1:修正了一個錯字。

回答

2

EF模型設計器不提供更改繼承修飾符的選項。儘管有幾個解決方法。

  1. 在T4模型中構建一個基於約定的系統,當屬性的名稱與某個特定模式匹配時,您的反應不同(添加覆蓋關鍵字)。
  2. 使用接口而不是基類,並在靜態類/擴展方法中定義邏輯。
  3. 在EF設計器中重命名相關屬性,並可選擇將其訪問修飾符設置爲私有。通過使抽象屬性反映重命名的屬性來實現抽象屬性。
+0

感謝您的回覆。你知道如果我使用解決方案3,Linq to Entities是否還能工作? – 2012-02-15 11:12:36

+0

我最終使用了你的解決方法1.這是一個非常糟糕的黑客攻擊,我討厭它(並提出了20行代碼註釋來解釋爲什麼我討厭它),但它有效。謝謝。 – 2012-02-17 11:49:28