在实体框架核心中配置一对多和一对一的关系



我是实体框架的新手,并且正在使用核心版本拾取它。我正在尝试了解如何自定义模型关系。

我的基本模型是我有一个公司实体和一个联系实体。公司可以有很多联系人。公司可以使用KeyContact,这必须是相关的联系人之一,但不需要。

因此,有一对一的关系,但也有一对一的关系。我试图按以下方式实现此目标(为了清楚起见,将大多数其他字段删除);

public class Company
{
    public int Id { get; set; }
    public int? KeyContactId { get; set; }
    public ICollection<Contact> Contacts { get; set; }
    public Contact KeyContact { get; set; }
}
public class Contact
{
    public int Id { get; set; }
    public int CompanyId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public Company Company { get; set; }
}

它无法与消息添加此迁移;

无法确定" iCollection"类型的导航属性"公司"所代表的关系。要么手动配置关系,要么从模型中忽略此属性。

我可以看到为什么要抱怨这一点,但是我不确定模型构建器是否可以配置它,或者它是否是无效的模式。我的模型构建器目前只是基本;

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    modelBuilder.Entity<Company>().ToTable("Company");
    modelBuilder.Entity<Contact>().ToTable("Contact");
}

我知道我可以在联系人表中有一个标志说ISKeyContact,但我喜欢在公司实体中拥有导航属性的想法。所以我想知道含糖实体会有多大。

任何帮助。

谢谢,

nick

通过将以下行添加到OnModelCreating方法:

来避免异常
modelBuilder.Entity<Company>().HasMany(p => p.Contacts).WithOne(d => d.Company).HasForeignKey(d => d.CompanyId);

这将配置Company.Contacts -Contact.Company关系。默认情况下,Company.KeyContact关系被配置为以下行在OnModelCreating方法中:

modelBuilder.Entity<Company>().HasOne(e => e.KeyContact).WithMany().HasForeignKey(e => e.KeyContactId);

因此,联系可以是多个公司的关键。为了确保最多可以是一家公司的关键,Company.KeyContact关系可以通过OnModelCreating方法中的以下行进行配置:

modelBuilder.Entity<Company>().HasOne(e => e.KeyContact).WithOne().HasForeignKey<Company>(e => e.KeyContactId);

,但请注意:这将无法确保KeyContact是联系人的成员。

最新更新