2010-09-17 3 views
3

У меня есть несколько классов, которые наследуются от абстрактного базового класса, который содержит некоторый общий код полезности. Я хочу перейти к EF для доступа к данным, но мне все же хотелось бы, чтобы объекты наследовали общий код в базовом классе. Классы EF уже наследуются от EntityObject, поэтому я не могу наследовать свой базовый класс. Каков правильный способ справиться с этим? My environment is Net 3.5/C#Как получить класс Entity Framework наследовать базовый класс

ответ

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

+0

@ Андрей: Да, это очень интересный подход. Однако утомительным было бы преуменьшение, если у вас есть модель с 100 объектами. Хотя вы можете использовать шаблоны T4 или шаблоны CodeSmith для генерации частичных объектов. – CodingGorilla

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