Первая карта EF Code от 1 до 0 с наследованием

EF 4.1

У меня есть Таблица продуктов, продукт может быть разных типов, например, рубашка и брюки. Я считаю, что это называется SuperType и SubType

Товары (1..1:0)

Товары (1..1:0)

e.g.

Products
--------
ProductId (PK)
Product Name
Product Type (1 or 2, let's say 1 is Shirt, 2 is Pants)

ProductShirtType
----------------
ProductId (PK, FK)
HasShortSleeves
etc....

ProductPantsType
----------------
ProductId (PK, FK)
IsCargoPants
etc...

Я пытаюсь смоделировать это в EF CF, и таблица на тип (TPT) соответствует этим требованиям. Проблема, с которой я сталкиваюсь, заключается в том, что пользователь может изменять типы продуктов, и, согласно этому ответу Ладислава Мрнки, это невозможно и вместо этого следует отдавать предпочтение композиции:

Модель Entity Framework с наследованием таблицы для каждого типа

Это здорово, так что теперь мои модели выглядят так:

public class Product {
  public int Id { get; set; }
  public string Name { get; set; }
  public int ProductType { get; set; }
  public virtual ProductSubType SubType {get; set;}
}

public abstract class ProductSubType {
  public int Id { get; set; }
  public virtual Product Product {get; set;}
}

public class ProductShirt : ProductSubType {
  public bool HasShortSleeves { get; set; }
}

public class ProductPants : ProductSubType {
  public bool IsCargoPants { get; set; }
}

Я не понимаю, как сопоставить абстрактный тип и подтипы. И не менее важно, как я перехожу с одного типа продукта на другой.


person B Z    schedule 28.02.2012    source источник
comment
Таблицы определены вами или они предопределены и не могут быть изменены? Зачем нужно переходить с одного типа продукта на другой? Почему рубашка становится брюками?   -  person Pawel    schedule 02.03.2012
comment
@Pawel таблицы не предопределены. Тип продукта — это всего лишь пример, но в реальном случае это вполне допустимо. В случае конвертации мы в конечном итоге отбросим значения, специфичные для рубашки, и позволим изменить тип продукта на брюки.   -  person B Z    schedule 02.03.2012
comment
Тогда я не уверен, что ваш дизайн действителен. В С#, если у вас есть объект типа A, вы не можете просто преобразовать его в объект типа B — вам нужно будет создать новый объект B и скопировать то, что применимо. Если вы хотите иметь возможность изменять тип объекта, вам может быть лучше иметь флаг, указывающий, что это за объект. В этом изменении типа будет изменение флага. Я предполагаю, что объекты имеют одинаковые свойства. Если они этого не сделают, то я не думаю, что они легко конвертируются.   -  person Pawel    schedule 03.03.2012