我对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,但我喜欢在公司实体中拥有导航属性的想法。所以我想知道实体是多么含糖。
任何帮助都非常感激。
谢谢,
尼克
答案 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是联系人的成员。