Есть ли способ позволить двум дочерним объектам ссылаться на один и тот же базовый объект, используя наследование? - PullRequest
0 голосов
/ 31 января 2019

Я хочу сохранить производный объект в моей БД с внешним ключом существующего базового объекта.Это вообще возможно?У меня есть что-то вроде этого:

public class Base
{
    public int BaseId { get; set; }
}

[Table("ChildA")]
public class ChildA : Base
{
    /*...*/
}

[Table("ChildB")]
public class ChildB : Base
{
    /*...*/
}

У меня есть существующий ChildA, и я хочу создать ChildB с тем же BaseId, что и ChildA.Проблема в том, что EntityFramework не позволит мне сделать это.Если я пытаюсь сохранить ChildB, передав существующий BaseId, создается новый Base.Я понимаю, что это принцип наследования, но могу ли я достичь того, что я описал?

1 Ответ

0 голосов
/ 31 января 2019

Наследование подразумевает отношение «есть», а не «имеет», и именно так EF моделирует его на уровне базы данных.Производный тип будет иметь внешний ключ «один к одному», созданный с его базовым типом.Таким образом, вы не можете иметь несколько производных элементов, использующих один и тот же базовый элемент, так как это нарушит ссылочную целостность.

Длинные и короткие, если вы хотите «поделиться» базовым элементом, он не должен быть базовымвсе, но добавлено через композицию:

public class ChildA
{
    public Base Base { get; set; }
}

public class ChildB
{
    public Base Base { get; set; }
}

Очевидно, вы захотите изменить имена классов в этот момент, так как они больше не имеют смысла.

...