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

时间:2016-06-26 18:48:53

标签: 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 { get; set; }
    public string Name { get; set; }
}

public class Entity
{
    [Key]
    public Guid Id { get; set; } = Guid.NewGuid();
}

这是我现在正在尝试但我不确定这是最好的方法。

var person1 = new Person { Name = "person1" };
var person2 = new Person { Name = "person2" };
var person3 = new Person { Name = "person3" };

var user1 = new User { Username = "sportsguy23", Person = person1};
var user2 = new User { Username = "sportsguy24", Person = person1};
var user3 = new User { Username = "sportsguy25", Person = person2};
var user4 = new User { Username = "sportsguy26", Person = person3};

context.Person.AddOrUpdate(user1);
context.Person.AddOrUpdate(user2);
context.Person.AddOrUpdate(user3);
context.Person.AddOrUpdate(user4);

插入记录后,我的Person表看起来像这样(NULL外键:/)。

Person table

我意识到这有效,但它似乎并不是最佳的。是否有可能每个用户只有一条记录(几乎结合了人和用户记录)?如果有人有更好的基础/派生类方法,请告诉我。提前谢谢!

1 个答案:

答案 0 :(得分:2)

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

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

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

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

您可以在here

中阅读更多内容

我认为您所寻找的是每个混凝土类别(TPC),如下所示:

enter image description here enter image description here

更新:

我发现你的问题。您不需要将属性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; }
}