C# 实体框架-表需要两个外键指向同一个表

C# 实体框架-表需要两个外键指向同一个表,c#,entity-framework,database-design,foreign-keys,ef-model-builder,C#,Entity Framework,Database Design,Foreign Keys,Ef Model Builder,我正在处理一个现有的项目,其中有一个包含联系人表的数据库:Id、FirstName、LastName、MobileNumber等 我现在想要实现一个表,通过它我可以将成对的联系人链接在一起。我构建了一个名为contactMatches的类:Id、contact1、contact2,其中contact1和contact2应该作为FK链接到contactId列。我正在考虑使用EntityFrameworksModelBuilder.entity功能为表示类的表创建数据关系 我对数据库设计和实体框架比

我正在处理一个现有的项目,其中有一个包含联系人表的数据库:Id、FirstName、LastName、MobileNumber等

我现在想要实现一个表,通过它我可以将成对的联系人链接在一起。我构建了一个名为contactMatches的类:Id、contact1、contact2,其中contact1和contact2应该作为FK链接到contactId列。我正在考虑使用EntityFrameworksModelBuilder.entity功能为表示类的表创建数据关系

我对数据库设计和实体框架比较陌生。这可以在一个链接表内完成,还是我需要走另一条路线

我考虑过的另一种方法是创建一个表,将contact1和contact2存储为整数,因为它仅在交叉引用数据库中的表和其他表时使用。这看起来很糟糕,因为contactMatches表可能包含不存在的contactId,因此需要对此进行保护

做我想做的事情的最好方法是什么,有什么想法吗

谢谢,
JK

您可以在重写OnModelCreating方法中实现这一点

modelBuilder.Entity<Contacts>()
            .HasMany(e => e.ContactMatches1)
            .WithRequired(e => e.Contact1)
            .HasForeignKey(e => e.Id);

        modelBuilder.Entity<Contacts>()
            .HasMany(e => e.ContactMatches2)
            .WithRequired(e => e.Contact2)
            .HasForeignKey(e => e.Id);
前提是ContactMatches1+2是Contacts类中的导航属性

public virtual ICollection<ContactMatches> ContactMatches1 { get; set; }

好的……不是每个联系人都有联系人匹配,这有关系吗?我将尝试此操作。因为联系人中的导航属性是集合,所以每个联系人都可以与ContactMatch有0..N关系。Contact1对于我们已经有一个实时填充的联系人表有什么影响?对联系人模型的结构更改会有任何影响吗?如果您先使用代码,那么它可能会创建一个额外的迁移,具体取决于DbContext在此更改之前的外观。我知道需要添加迁移,但是联系人表中存在的数据呢?数据库中的contactMatches集合是什么样子的?我只是对db中的物理外观感到困惑。EF是否会创建ContactMatches表?您能否提供有关contact1、contact2、ContactMatches等类别的更多信息。我不清楚他们的目的,以及他们的全部能力。我看到了继承的可能性,但我想先确定一下。你可以直接在这里发布他们的类定义。这里没有contact1或contact2类。如果这让人困惑,很抱歉。有一个联系人类:int-Id、string-first、string-last、string-mobileNumber、string-email、deliverymethods-delivery-method。传递方式是指电子邮件或手机的首选方式。然后是contactMatch:int Id、Contact contact1、Contact contact2、Message Message…….数据库中已经存在联系人表,消息只是文本和目标位置,数据库中也有一个表。