Модель Entity Framework с наследованием таблиц для типов - PullRequest
3 голосов
/ 07 сентября 2011

Когда я определяю модель в Entity Framework с наследованием таблиц для типов, если у меня есть базовый класс / таблица (не абстрактный) с именем person, и две дочерние сущности и таблицы, взрослый и дочерний, после создания дочернего элементакак бы взять тот же объект и преобразовать его во взрослый?После преобразования во взрослую запись о ребенке следует удалить, хотя данные базового класса в таблице лиц следует сохранить.

Ответы [ 2 ]

4 голосов
/ 07 сентября 2011

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

Это совсем не похоже на сценарий наследования.

Редактировать:

Комментарий о наследовании был предназначен для сценария, в котором вы упомянули Person, Adult и Child сущности.В любом случае, если ваш сценарий позволяет изменить тип, вам следует подумать о другом решении, в котором часть, которая может измениться, будет обработана композицией.

Например:

public class DataSource
{
    public int Id { get; set; }
    public virtual DataSourceFeatures Features { get; set; }
}

public class DataSourceFeatures
{
    [Key, ForeignKey("DataSource")]
    public int Id { get; set; }
    public virtual DataSource DataSource { get; set; }
}

public class XmlDataSourceFeatures : DataSourceFeatures { ... }

public class DelimitedDataSourceFeatures : DataSourceFeatures { ... }

public class ServiceDataSourceFeatures : DataSourceFeatures { ... }

Теперь изменение типа означает удаление зависимого тока DataSourceFeatures из базы данных и создание нового, но исходный объект остается тем же - изменения только отношения.

3 голосов
/ 07 сентября 2011

Я бы не стал делать это с EF, потому что с наследованием вы создали объектно-ориентированную абстракцию над табличными отношениями, которая не позволяет вам конвертировать из разных типов. В ОО вы не можете делать такие вещи:

Child child = new Child();
Adult grownUp = child;

А потом ожидайте, что ребенок станет взрослым. Вы бы сделали это так:

Child child = new Child();
Adult grownUp = child.GrowUp();

Итак, если вы используете SQL Server, вы можете сделать это с помощью хранимой процедуры. Что-то вроде GrowUp (child) и создайте новую запись в таблице Adult, а также удалите запись в таблице Child, но оставьте Person без изменений. Вы можете вернуть новый взрослый объект из процедуры. Это может быть использовано следующим образом:

Adult grownUp = context.GrowUp(child);

Однако вам необходимо убедиться, что после этой строки вы больше не используете дочерний объект и вам, вероятно, нужно обновить или удалить его из контекста (не совсем уверен в этом).

...