我是实体框架的新手,并且正在使用核心版本拾取它。我正在尝试了解如何自定义模型关系。
我的基本模型是我有一个公司实体和一个联系实体。公司可以有很多联系人。公司可以使用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是联系人的成员。