1

由于某种原因,在生成我的数据库时,我得到了一个不必要的外键,我不知道如何停止它。

复制此问题的示例如下:

public class Person
{
   public int PersonId { get; set; }
   public string Name { get; set; }
   public virtual ICollection<PersonRelationships> PersonRelationships { get; set; }
}

public class PersonRelationship
{
   public int PersonRelationshipId { get; set; }
   public Person PersonOne { get; set; }
   public Person PersonTwo { get; set; }
   public PersonRelationshipType RelationshipType { get; set; }
}

public enum PersonRelationshipType
{
   Mother = 1,
   Father = 2,
   Sibling = 3
}

在我的DbContext我有:

DbSet<Person> People { get; set; }

现在奇怪的是,当我使用代码优先迁移生成模型时,该PeopleRelationships表将获得预期的外键PersonOne_PersonIdPersonTwo_PersonId但随后Person_PersonId也会出现意外情况。我认为这与人的参考有关,但我不确定如何摆脱它,因为我需要那个参考。

我错过了什么?

4

2 回答 2

1

根据 Steve Greene 对原始帖子的评论,答案是使用 [InverseProperty("PropertyName")] 属性标记逆属性。

谢谢史蒂夫!

于 2017-06-16T23:34:33.980 回答
0

同一张表有两个外键。我认为您需要使用DbModelBuilder来定义您的外键并编辑 Person 模型,如下所示。然后你可以更新你的数据库。

public class Person
{
   public int PersonId { get; set; }
   public string Name { get; set; }
   public virtual ICollection<PersonRelationships> PersonOneRelationships { get; set; }
   public virtual ICollection<PersonRelationships> PersonTwoRelationships { get; set; }
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<PersonRelationship>()
                    .HasRequired(m => m.PersonOne )
                    .WithMany(t => t.PersonOneRelationships)
                    .HasForeignKey(m => m.PersonOneId)
                    .WillCascadeOnDelete(false);

        modelBuilder.Entity<PersonRelationship>()
                    .HasRequired(m => m.PersonTwo )
                    .WithMany(t => t.PersonTwoRelationships)
                    .HasForeignKey(m => m.PersonTwoId)
                    .WillCascadeOnDelete(false);
    }
于 2017-06-15T10:01:50.443 回答