在Entity Framework Core中配置一对多和一对一的关系

时间:2017-09-05 21:16:20

标签: entity-framework entity-framework-core

我对Entity Framework很新,并且正在使用Core版本。 我正在尝试了解如何自定义模型关系。

我的基本模型是我有一个公司实体和一个联系人实体。公司可以拥有多个联系人。公司可以使用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”类型的导航属性“Company.Contacts”所代表的关系。手动配置关系,或忽略模型中的此属性。

我可以理解为什么它会抱怨这个,但我不确定模型构建器是否有办法可以配置它,或者它是否是无效模式。我的模型构建器目前只是基本的;

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<Company>().ToTable("Company");
    modelBuilder.Entity<Contact>().ToTable("Contact");
}

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

任何帮助都非常感激。

谢谢,

尼克

1 个答案:

答案 0 :(得分:1)

通过将以下行添加到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);

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

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

但是请注意:这不能确保KeyContact是联系人的成员。