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

Entity framework 在实体框架核心中配置一对多和一对一关系,entity-framework,entity-framework-core,Entity Framework,Entity Framework Core,我对实体框架非常陌生,现在正在使用核心版本。 我试图理解如何定制模型关系 我的基本模型是,我有一个公司实体和一个联系人实体。一家公司可以有很多联系人。公司可以使用KeyContact,它必须是关联联系人之一,但不是必需的 因此,存在一对多关系,但也存在一对一关系。我尝试如下实现(为了清晰起见,删除了大多数其他字段) 上市公司 { 公共int Id{get;set;} public int?KeyContactId{get;set;} 公共ICollection联系人{get;set;} 公共联系

我对实体框架非常陌生,现在正在使用核心版本。 我试图理解如何定制模型关系

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

因此,存在一对多关系,但也存在一对一关系。我尝试如下实现(为了清晰起见,删除了大多数其他字段)

上市公司
{
公共int Id{get;set;}
public int?KeyContactId{get;set;}
公共ICollection联系人{get;set;}
公共联系人密钥联系人{get;set;}
}
公共类联系人
{
公共int Id{get;set;}
public int CompanyId{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
上市公司{get;set;}
}
无法将此迁移添加到消息中

无法确定“ICollection”类型的导航属性“Company.Contacts”表示的关系。手动配置关系,或者从模型中忽略此属性

我可以理解为什么它会抱怨这个,但我不确定是否有一种方法可以使用模型生成器配置它,或者它是否是一个无效的模式。我的模型生成器目前只是基本的

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

    modelBuilder.Entity<Company>().ToTable("Company");
    modelBuilder.Entity<Contact>().ToTable("Contact");
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
基于模型创建(modelBuilder);
modelBuilder.Entity().ToTable(“公司”);
modelBuilder.Entity().ToTable(“联系人”);
}
我知道我可以在联系人表中使用一个标志来表示IsKeyContact,但是我喜欢在公司实体中使用导航属性的想法。所以我想知道这个实体有多甜

非常感谢您的帮助

谢谢


Nick

通过将以下行添加到OnModelCreating方法中,可以避免异常:

modelBuilder.Entity<Company>().HasMany(p => p.Contacts).WithOne(d => d.Company).HasForeignKey(d => d.CompanyId);
modelBuilder.Entity<Company>().HasOne(e => e.KeyContact).WithMany().HasForeignKey(e => e.KeyContactId);
modelBuilder.Entity<Company>().HasOne(e => e.KeyContact).WithOne().HasForeignKey<Company>(e => e.KeyContactId);
因此,联系人可以是多个公司的关键联系人。 为了确保联系人最多可以是一家公司的关键联系人,请选择
公司。可以通过
OnModelCreating
方法中的以下行配置关键联系人关系:

modelBuilder.Entity<Company>().HasMany(p => p.Contacts).WithOne(d => d.Company).HasForeignKey(d => d.CompanyId);
modelBuilder.Entity<Company>().HasOne(e => e.KeyContact).WithMany().HasForeignKey(e => e.KeyContactId);
modelBuilder.Entity<Company>().HasOne(e => e.KeyContact).WithOne().HasForeignKey<Company>(e => e.KeyContactId);
modelBuilder.Entity();

但请注意:这不会确保KeyContact是Contacts的成员。

手动配置关系。。。你试过这个吗@Gert Arnold引用了您的链接:“如果在两种类型之间定义了多个导航属性(即多个相互指向的不同导航对),则不会按照约定创建任何关系,您需要手动配置它们以确定导航属性如何配对。”即联系人列表和一个特定的Contact@Grenville您是否仍有问题或需要更多帮助?还是你接受了答案?