EF 4.0 наследование на основе дженериков - PullRequest
3 голосов
/ 14 марта 2011

У меня есть такой класс

public abstract class BaseType<T>
{
  public string Name {};
  public T TypedValue { 
    get {
       return GetTypedValue(PersistedValue);
        }  
  };
  public string PersistedValue {} 
  public abstract T GetTypedValue(PersistedValue);
}

тогда много производных классов, таких как

public class IntegerType:BaseType<int>
{
 ...
}

возможно ли отобразить эту иерархию, используя EF 4.0, используя таблицу на схему наследования? В настоящее время сгенерированный код создает ошибку, поскольку генерирует свойство типа

.
public <T> ObjectSet<TypedAttribute<T>> TypedAttributes
{
     get 
     { 
        return _typedAttributes  ?? (_typedAttributes = CreateObjectSet<TypedAttribute<T>>("TypedAttributes")); }
     }
private ObjectSet<TypedAttribute> _typedAttributes;

1 Ответ

2 голосов
/ 14 марта 2011

Я так не думаю, потому что:

  • Для отображения наследования базовый класс должен быть сущностью в EDMX.
  • Когда используется наследование, ObjectSet для базового типа. Какой общий аргумент вы бы использовали для создания экземпляра ObjectSet, когда он должен использоваться для извлечения любого подтипа?

Это может быть частично достигнуто без наследования (по крайней мере, для POCO). Просто смоделируйте свои подтипы в EDMX без базового типа. Затем вручную создайте классы POCO и выведите их из базовых базовых типов. Единственное правило, которому вы должны следовать, это то, что класс POCO должен иметь то же имя, что и сущность в EDMX, и у него должны быть все его свойства с возможностью доступа, установленной в EDMX. Если вы хотите использовать свойства отслеживания изменений, они должны быть помечены как виртуальные. Если вы хотите использовать ленивую загрузку, свойства навигации также должны быть виртуальными.

Пример:

Предположим, у меня есть два объекта в EDMX: IntegerValue и DoubleValue. Теперь я определил эти POCO следующим образом:

public abstract class BaseType<T>
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual T Value { get; set; }
}

public class IntegerValue : BaseType<int>
{ }

public class DoubleValue : BaseType<double>
{ }

Результатом будет одна таблица для каждого подтипа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...