C# 在实体框架核心中使用每个层次结构的表时,为什么会得到重复的ID列?

C# 在实体框架核心中使用每个层次结构的表时,为什么会得到重复的ID列?,c#,entity-framework,entity-framework-core,C#,Entity Framework,Entity Framework Core,我试图使用“每个层次结构的表”来使用EF Core(2.1)对数据库中的各种帐户类型进行建模,但我遇到了一个问题,即为派生类型添加了额外的外键列。我看到了问题/答案,但我认为这和我的情况不一样 以下是我的帐户类别: public abstract class Base { [Key] public int Id { get; set; } } public class Standard : Base { public int ParentId { get; set; }

我试图使用“每个层次结构的表”来使用EF Core(2.1)对数据库中的各种帐户类型进行建模,但我遇到了一个问题,即为派生类型添加了额外的外键列。我看到了问题/答案,但我认为这和我的情况不一样

以下是我的帐户类别:

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
{
}
公共抽象类基类
{
[关键]
公共int Id{get;set;}
}
公共类标准:基
{
public int ParentId{get;set;}
[ForeignKey(name of(ParentId))]
公共提升父级{get;set;}
}
公共抽象类:基
{
公共ICollection帐户{get;set;}=new List();
}
公共舱加号:高架
{
}
公共级终极版:提升版
{
}
我在DbContext构造函数中配置了如下TPH:

builder.Entity<Base>()
    .HasDiscriminator<string>("Type")
        .HasValue<Ultimate>("ultimate")
        .HasValue<Plus>("plus")
        .HasValue<Standard>("standard");
builder.Entity()
.HasDiscriminator(“类型”)
.HasValue(“最终”)
.HasValue(“加”)
.HasValue(“标准”);
我将一些基本数据如下:

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 });
builder.Entity().HasData(新的Ultimate(){Id=1});
builder.Entity().HasData(新的Plus(){Id=2});
builder.Entity().HasData(新标准(){Id=3,ParentId=1});
然后运行迁移时,我得到以下表格:

根据这些数据:

正如您所看到的,我有一个我不想要的
ElevatedId
列。如果我将
账户
集合从
提升的
类中移除,我将不会获得该列;但我需要/想要那个导航属性


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

在您的模型中,任何基都可以添加到提升的
帐户中,因此每个基都需要和提升ID外键属性。只有标准才能具有提升的父级


一个标准可以有一个提升的
父项
,并且属于不同提升的
帐户。

啊!那么,将
账户的类型从
Base
更改为
Standard
的答案也是如此吗?对不起,我明天才离开电脑,但到那时我才知道!是的,这就是答案!谢谢@davidbrowne