在Entity Framework Core中使用“按层次结构表”时,为什么会得到重复的ID列?

时间:2019-02-04 17:18:08

标签: c# entity-framework entity-framework-core

我正在尝试使用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 });

然后我执行迁移时,我得到此表:

my table

具有以下数据:

my data

如您所见,我有一个不需要的ElevatedId列。如果我从Accounts类中删除Elevated集合,则不会获得该列;但我需要/想要该导航属性。

有什么我应该做不同的事情吗?

1 个答案:

答案 0 :(得分:1)

在您的模型中,可以将任何Base添加到Elevated的Accounts中,因此每个Base都需要ElevatedId外键属性。只有标准可以具有升高的Parent

并且标准可以具有高Parent并属于不同高的Accounts