EntityFramework 4.3 Супертип Поздняя инициализация - PullRequest
1 голос
/ 04 марта 2012

Я использую EF 4.3 с CodeFirst, и у меня есть модель супертипа / подтипа, похожая на эту:

public Person {
    long Id { get; set; }
    [Required]
    string Name { get; set; }
}
public Costumer : Person {
    string SomeData { get; set; }
    [Required]
    string SomeRequiredData { get; set; }
}

Это упрощенная версия проблемы. Таблицы имеют несколько полей. Человек может быть «повышен» до потребителя позже в приложении. Таким образом, сначала создается Person, а затем преобразуется в Customer.

Вопрос: после того, как я создаю Person, как я могу «продвинуть» его Продавцу, не создавая (или не воссоздая) новую запись Person? Если я сделаю:

var costumer = new Costumer { 
    Id = [same id used before when Person was created], 
    SomeRequiredData = "Data"  
};

Модель выдает ошибку, в которой указано, что имя требуется. От меня не требуется повторять всю необходимую информацию от Person в новом экземпляре Vendor, поскольку она уже есть в исходной записи Person.

Кто-нибудь может помочь?

P.S. Модель настроена на создание 2 отдельных таблиц, по одной для каждого класса ...

1 Ответ

3 голосов
/ 05 марта 2012

После того, как я создаю Person, как я могу «продвинуть» его Продавцу без создание (или воссоздание) новой записи Person?

С EF вы больше не можете, потому что вы не можете изменить тип существующего экземпляра (вы не можете привести Person к Customer). Поскольку вы не можете разыграть сущность, вы также не можете обновить ее тип в базе данных с помощью EF. В то же время вы не можете вставить Customer экземпляр с существующим Id, потому что эта операция предполагает вставку родительского и дочернего типа (помните, Customer - это Person в вашей модели, и из-за того, что вставка Customer означает также вставку Person ).

Причина, по которой это не работает, заключается в том, что модель вашего домена неверна. Вы не должны иметь Customer в качестве подтипа Person, потому что в ООП это означает именно то, что произошло сейчас - вы не можете изменить человека на клиента, не создав новый экземпляр лица (потому что клиент - это человек). Для поддержки этого сценария у вас должна быть только сущность Person, и у этой сущности должно быть свойство, описывающее его тип.

...