我正在研究实体框架核心代码优先方法和ASP.Net Core 2.1制作3个表:
- 人物类
public class Person
{
public string Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public PeopleProfessions PeopleProfessions { get; set; }
}
- 专业课程
public class Profession
{
public string Id { get; set; }
public string Name{ get; set; }
public PeopleProfessions PeopleProfessions { get; set; }
}
- 人民职业类
public class peopleprofessions
{
[ForeignKey("PersonId ")]
public string PersonId { get; set; }
public ICollection<Person> People { get; set; }
[ForeignKey("ProfessionId")]
public string ProfessionId{ get; set; }
public ICollection<Profession> Professions { get; set; }
}
关于我的背景:
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<peopleprofessions>().HasKey(up => new { up.PersonId, up.ProfessionId });
}
记住这一点:
- 人们可以有多种职业
- 专业表仅用于读取存储的数据,如"会计">
我对如何使表3只包含外国人以及它是否能满足我刚才提到的需求表示怀疑。
我试图适当地建立这种关系,但我也注意到,在表1和表2中,它同时要求表中人员的职业Id。
我不知道我是迷路了,还是看错了,或者是否有其他选择。谢谢你能给我的任何帮助。
您在导航项上使用Collections有点落后。对于你的主要实体(个人和职业(,它们应该有集合,因为它是一对多的。但对于PeopleProfessions,每条记录都是指向特定实体的单个链接,因此没有集合,只有一个直接的对象引用。
public class Person
{
public string Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public ICollection<PeopleProfessions> PeopleProfessions { get; set; }
}
public class Profession
{
public string Id { get; set; }
public string Name{ get; set; }
public ICollection<PeopleProfessions> PeopleProfessions { get; set; }
}
public class PeopleProfessions
{
public string PersonId { get; set; }
public Person Person { get; set; }
public string ProfessionId { get; set; }
public Profession Profession { get; set; }
}
您可以,但不需要指定ForeignKey属性,因为您遵循EF的命名约定(它会帮您解决问题(。您的OnModelCreating看起来对复合密钥是正确的。
您可能需要考虑从PeopleProfessions中删除复数(只需将类称为PeopleProfession(,因为一个实例代表单个People-Profession关系。我通常这样做,但实体中的导航名称仍然是复数,因为它可以表示多个,即
public ICollection<PeopleProfession> PeopleProfessions { get; set; }