我正在尝试使用EF Core(2.1)在数据库中使用“每个层次结构的表”对各种帐户类型进行建模,并且遇到一个问题,我正在为派生类型添加其他外键列。我见过this个问题/答案,但与我的情况不同。
这是我的帐户类别:
public abstract class Base
{
[Key]
public int Id { get; set; }
}
public class Standard : Base
{
public int ParentId { get; set; }
[ForeignKey(nameof(ParentId))]
public Elevated Parent { get; set; }
}
public abstract class Elevated : Base
{
public ICollection<Base> Accounts { get; set; } = new List<Base>();
}
public class Plus : Elevated
{
}
public class Ultimate : Elevated
{
}
我已经在DbContext构造函数中像这样配置了TPH:
builder.Entity<Base>()
.HasDiscriminator<string>("Type")
.HasValue<Ultimate>("ultimate")
.HasValue<Plus>("plus")
.HasValue<Standard>("standard");
然后我播入一些基本数据,如下所示:
builder.Entity<Ultimate>().HasData(new Ultimate() { Id = 1 });
builder.Entity<Plus>().HasData(new Plus() { Id = 2 });
builder.Entity<Standard>().HasData(new Standard() { Id = 3, ParentId = 1 });
然后我执行迁移时,我得到此表:
具有以下数据:
如您所见,我有一个不需要的ElevatedId
列。如果我从Accounts
类中删除Elevated
集合,则不会获得该列;但我需要/想要该导航属性。
有什么我应该做不同的事情吗?
答案 0 :(得分:1)
在您的模型中,可以将任何Base添加到Elevated的Accounts
中,因此每个Base都需要ElevatedId外键属性。只有标准可以具有升高的Parent
。
并且标准可以具有高Parent
并属于不同高的Accounts
。