如何从Entity Framework Code First中的表的主键创建两个外键

时间:2016-08-31 19:58:27

标签: c# database entity-framework

我的场景是,我有两个名为Person和RelationshipMappings的表。 在Person表中,PersonId是主键。 在RelationshipMappings表中,有两个整数LeftPersonId和RightPersonId。 这两个ID都应该是PersonId的ForeignKeys。

我在Relationship模型中创建了两个名为LeftPerson和RightPerson的Person Properties,然后创建了如下所示的表关系。

 entityBuilder
           .HasOne(r => r.LeftPerson)
           .WithMany(r => r.RelationshipMappings)
           .HasForeignKey(r => r.LeftPersonId)
           .HasConstraintName("FK_RelationshipMapping_LeftPerson");


        entityBuilder
           .HasOne(r => r.RightPerson)
           .WithMany(r => r.RelationshipMappings)
           .HasForeignKey(r => r.RightPersonId)
           .HasConstraintName("FK_RelationshipMapping_RightPerson");

我应该在Person Model(LeftPerson和RightPerson)中有两个集合吗?因为现在我在PersonModel中只有一个集合。

  public ICollection<RelationshipMapping> RelationshipMappings { get; set; }

此外,我也有PersonModel中提到的关系。

      entityBuilder
            .HasMany(e => e.RelationshipMappings)
            .WithOne(e => e.LeftPerson);

        entityBuilder
            .HasMany(e => e.RelationshipMappings)
            .WithOne(e => e.RightPerson);

由于某种原因它不起作用。它无法创建表和之后的所有内容。我看不到异常。我试图找出它。

有人可以帮我吗?

1 个答案:

答案 0 :(得分:0)

好的,我找到了解决方案。我不得不将删除行为添加到外键中。

           entityBuilder
           .HasOne(r => r.LeftPerson)
           .WithMany(r => r.LeftRelationshipMappings)
           .HasForeignKey(r => r.LeftPersonId)
           .HasConstraintName("FK_RelationshipMapping_LeftPerson")
           .OnDelete(DeleteBehavior.Restrict);


        entityBuilder
           .HasOne(r => r.RightPerson)
           .WithMany(r => r.RightRelationshipMappings)
           .HasForeignKey(r => r.RightPersonId)
           .HasConstraintName("FK_RelationshipMapping_RightPerson")
           .OnDelete(DeleteBehavior.Restrict);

现在一切都按预期工作了。我必须有两个收藏品。它不适用于一个集合。它会给出以下错误。

Cannot create a relationship between 'Person.RelationshipMappings' and 'RelationshipMapping.RightPerson', because there already is a relationship between 'Person.RelationshipMappings' and 'RelationshipMapping.LeftPerson'. Navigation properties can only participate in a single relationship.

感谢您的评论。