C# 如何使用实体框架插入派生类(TPH方法)

C# 如何使用实体框架插入派生类(TPH方法),c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,以下是我的课程: public class User : Person { [Required] public Person Person { get; set; } [Required] public string Username { get; set; } } [Table("Person")] public class Person : Entity { [Required] public List<User> Users {

以下是我的课程:

public class User : Person
{
    [Required]
    public Person Person { get; set; }
    [Required]
    public string Username { get; set; }
}

[Table("Person")]
public class Person : Entity
{
    [Required]
    public List<User> Users { get; set; }
    public string Name { get; set; }
}

public class Entity
{
    [Key]
    public Guid Id { get; set; } = Guid.NewGuid();
}
插入记录后,我的Person表如下所示(空外键:/)


我意识到这是可行的,但似乎并不理想。每个用户是否可能只有一条记录(基本上是个人和用户记录的组合)?如果有人有更好的基类/派生类方法,请告诉我。提前谢谢

有三种方法可以在数据库中实现继承

每个层次表(TPH):这种方法建议为整个类继承层次结构使用一个表。表包括区分继承类的鉴别器列。这是实体框架中的默认继承映射策略

每种类型的表(TPT):这种方法为每个域类建议一个单独的表

每个具体类的表(TPC):这种方法建议一个具体类使用一个表,而不是抽象类。因此,如果在多个具体类中继承抽象类,那么抽象类的属性将成为具体类的每个表的一部分

你可以在网上阅读更多

我认为您需要的是每混凝土等级表(TPC),如下所示:

更新:

我发现了你的问题。您不需要将属性
Person
添加到
User
类中,因为它已经从该类继承。移除它,它应该会工作

public class User : Person
{
    //[Required]
    //public Person Person { get; set; } Remove this line
    [Required]
    public string Username { get; set; }
}

[Table("Person")]
public class Person : Entity
{
    [Required]
    public List<User> Users { get; set; }
    public string Name { get; set; }
}
公共类用户:个人
{
//[必需]
//公共人物{get;set;}删除此行
[必需]
公共字符串用户名{get;set;}
}
[表格(“人士”)]
公共类人员:实体
{
[必需]
公共列表用户{get;set;}
公共字符串名称{get;set;}
}

为什么用户从Person继承并持有对Person的引用?您的实体关系模型在哪里?@LewisTaylor我这样做是因为我希望Person能够在多个派生类之间共享,例如,如果添加了从Person派生的管理类。然后,用户和用户可以共享同一个人Admin@ErisPerson是唯一的表,它是自参考Person User是一对多。你如何将它们组合成一张唱片?谢谢你的回复@Arvin。我意识到我正在使用TPH方法。然而,我想知道我是否能改进我的实现。@chandler,你知道,你的方法没有错,也没有更好的方法。这一切都基于您的域以及您需要如何处理数据。每种方法都有它自己的好处。使用TPH方法,每个用户只能有一个记录(几乎可以将个人和用户记录结合起来)?@chandler从用户类中删除个人属性
public class User : Person
{
    //[Required]
    //public Person Person { get; set; } Remove this line
    [Required]
    public string Username { get; set; }
}

[Table("Person")]
public class Person : Entity
{
    [Required]
    public List<User> Users { get; set; }
    public string Name { get; set; }
}