对EF核心2.1关系的怀疑



我正在研究实体框架核心代码优先方法和ASP.Net Core 2.1制作3个表:

  1. 人物类
public class Person
{
public string Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public PeopleProfessions PeopleProfessions { get; set; }
}
  1. 专业课程
public class Profession
{
public string Id { get; set; }
public string Name{ get; set; }
public PeopleProfessions PeopleProfessions { get; set; }
}
  1. 人民职业类
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; }

最新更新