以下是我的课程:
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外键:/)。
我意识到这有效,但它似乎并不是最佳的。是否有可能每个用户只有一条记录(几乎结合了人和用户记录)?如果有人有更好的基础/派生类方法,请告诉我。提前谢谢!
答案 0 :(得分:2)
您可以在数据库中实现三种方法继承。
每个层次结构的表(TPH):此方法为整个类继承层次结构建议一个表。表包括区分继承类的鉴别器列。这是Entity Framework中的默认继承映射策略。
每种类型的表格(TPT):此方法为每个域类建议一个单独的表。
每个具体类的表(TPC):这种方法建议一个表用于一个具体类,但不用于抽象类。因此,如果您在多个具体类中继承抽象类,那么抽象类的属性将成为具体类的每个表的一部分。
您可以在here
中阅读更多内容我认为您所寻找的是每个混凝土类别(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; }
}