2011-09-25 3 views
1

У меня есть несколько таблиц в db, которые идентичны по структуре столбцов.Сопоставьте несколько объектов с абстрактным базовым классом или интерфейсом 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

Я не знаю, чего вы действительно хотите, но вы можете использовать наследование TPT, TPH и TPC в EF. Кроме того, спасибо, и если ответ вам поможет, проголосуйте, пожалуйста. С уважением. –

Смежные вопросы