2011-09-25 101 views
1

我有一個數據庫中的多個表中列結構相同的表。將多個實體映射到EF4抽象基類或接口?

我想有這個仿照EF4讓他們從單一的抽象基類繼承,所以我能寫常見的方法等

我試過一個抽象基類,但這種手段我需要將屬性添加到不在基類中的每個實體。它也似乎我失去了我的收藏,因爲每一個現在是一個基本類型的集合?

我可以添加部分類並從通用接口繼承每個類嗎?

例如

Table 1  Table 2  Table 3 
Id   Id   Id 
Month1  Month1  Month1 
Month2  Month2  Month2 
Month3  Month3  Month3 
Quarter2 Quarter2 Quarter2 
Quarter3 Quarter3 Quarter3 
Quarter4 Quarter4 Quarter4 

怎樣纔可以有一個基類或接口被稱爲「表」,讓我可以寫我對所有的方法,而不是針對每個單獨的表?

+0

你能不能有作爲TABLETYPE另一列?那麼你可以有一張桌子。 – Damith

+0

@DSW:出於性能考慮而拆分 - 每個表有數百萬行,所以我想將它們分開。 – BlueChippy

+0

這將幫助你http://blogs.msdn.com/b/efdesign/archive/2009/10/12/code-only-further-enhancements.aspx – Damith

回答

0

如果你是力,以保持單獨的表,而你只是希望能夠寫 常用的方法,你可以使用一個接口和擴展方法如下圖所示:

public interface ITableBase{ 
    int Id{ get; set; } 
    // other properties 
    void Method1(); 
    int Method2(); 
    string Method3(int some_arguments); 
} 

public partial class Table1 : ITableBase{ 
    // implement ITableBase and other properties and methods 
} 

public partial class Table2 : ITableBase{ 
    // implement ITableBase and other properties and methods 
} 

public partial class Table2 : ITableBase{ 
    // implement ITableBase and other properties and methods 
} 

static public class ITableBaseExtensions{ 
    static public string GetIdAsString(this ITableBase table){ 
     return table.Id.ToString(); 
    } 
    static public int UsingMethod2(this ITableBase table){ 
     var i = table.Method2(); 
     return i * 5 + 9 - 14/3 % 7 /* etc... */; 
    } 
    static public void AddingNewMethodToTables(this ITableBase table, string some_string, 
     int some_int, YourType any_other_parameter /* etc... */){ 
     // implement the method you want add to all Table classes 
    } 
    // 
    // You can add any method you want to add to table classes, here, as an Extension method 
    // 
} 

而在消費者,你可以調用ITableBaseExtensions類中定義的所有方法中的所有表:

public class MyConsumer{ 
    public void MyMethod(){ 
     Table1 t1 = new Table1(); 
     Table1 t2 = new Table2(); 
     Table1 t3 = new Table3(); 

     t1.UsingMethod2(); // will be called from ITableBaseExtensions 
     t1.Method2(); // will be called from ITableBase - must implemented in Table1 class 

     t2.Method3(some_argument); // will be called from ITableBase - must implemented in Table2 class 
     t2.GetIdAsString(); // will be called from ITableBaseExtensions 

     // etc. 
    } 
} 
+0

謝謝,我希望避免所有重複部分類定義,但似乎是實現這一目標的唯一明智方式。 – BlueChippy

+0

我不知道你真的想要什麼,但是你可以在EF中使用TPT,TPH和TPC繼承。此外,感謝接受,如果答案對您有幫助,請將其投票。問候。 –