【问题标题】:Entity Framework 6 adds additional foreign key with underscoreEntity Framework 6 添加了带下划线的额外外键
【发布时间】:2018-07-18 09:13:25
【问题描述】:

我在使用 Entity Framework 6 时遇到问题。

迁移生成带有下划线的额外外键。

我有一个 Person 和 PersonRelative 表

人员表

  • 身份证
  • 姓名

PersonRelative 表

  • 身份证

  • PersonId

  • RelativeId(人员类型)

  • 关系(附加表,确定什么是关系 人与其亲属的关系。)

实体框架迁移首先使用代码为 PersonId 添加一个额外的外键,它是一个 Person_Id。

所以基本上,PersonRelative 表有:

  • 身份证
  • 人员标识
  • 相对 ID
  • 关系
  • Person_Id

这是生成的代码:

CreateTable(
            "dbo.PersonRelatives",
            c => new
                {
                    Id = c.Int(nullable: false, identity: true),
                    Relationship = c.string(nullable: false),
                    PersonId= c.Int(nullable: false),
                    RelativeId= c.Int(nullable: false),
                    Person_Id= c.Int(),
                })
            .PrimaryKey(t => t.Id)
            .ForeignKey("dbo.Persons", t => t.PersonId, cascadeDelete: true)
            .ForeignKey("dbo.Persons", t => t.RelativeId, cascadeDelete: true)

            .ForeignKey("dbo.Persons", t => t.Person_Id)
            .Index(t => t.PersonId)
            .Index(t => t.RelativeId)
            .Index(t => t.Person_Id);

我的 PersonRelative 实体模型:

public class PersonRelative
{
    public int Id { get; set; }

    public string Relationship{ get; set; }




    [ForeignKey("Person")]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int PersonId{ get; set; }
    public Person Person { get; set; }

    [ForeignKey("Relative")]
    public int RelativeId { get; set; }
    public Person Relative { get; set; }

}

【问题讨论】:

  • 请在 C# 代码中显示类。
  • 去掉 PersonId 上的 [DatabaseGenerated(DatabaseGeneratedOption.None)]。可能不是您的问题,但在 FK 上不需要。
  • @SteveGreene 它实际上什么也没做,我只是从另一个 SO 帖子中得到它。我应该摆脱它。
  • 这也发生在我身上,在表格字段的名称中加上“ID”之后。我输入了“PersonID”,瞧……

标签: c# mysql entity-framework-6 entity-framework-migrations


【解决方案1】:

我设法通过将此代码(参见下面的代码 sn-p)添加到我的 DbContext OnModelCreating 来解决我的问题。

借助本文档: https://docs.microsoft.com/en-us/ef/ef6/modeling/code-first/fluent/relationships#configuring-a-composite-foreign-key

感谢@Giovanni 为我指明了正确的方向。

  modelBuilder.Entity<Person>()
       .HasMany(a => a.PersonRelatives)
       .WithMany()
       .Map(a =>
       {
           a.MapLeftKey("PersonId");
           a.MapRightKey("RelativeId");
       });

我的人相对类:

public class PersonRelative
{
    public int Id { get; set; }

    public string Relationship{ get; set; }




    [ForeignKey("Person")]
    public int PersonId{ get; set; }
    public Person Person { get; set; }

    [ForeignKey("Relative")]
    public int RelativeId { get; set; }
    public Person Relative { get; set; }

}

我的个人类:

public class Person
{
   public int Id { get; set; } 
   public string Name{ get; set; }
   public ICollection<PersonRelative> PersonRelatives {get;set;}
}

【讨论】:

  • 这不可能。 PersonPersonRelative 之间没有多对多关系。 PersonRelative的关系。我怀疑 Person 类中的某些东西会导致额外的 FK,这就是我要求显示类代码的原因。
  • @GertArnold,它实际上在我的迁移文件中生成了正确的 CreateTable 代码,并且种子也可以正常工作。我可以使用 Person.PersonRelatives 获取特定人的所有亲属并对其进行循环。
  • 我删除了这个 [DatabaseGenerated(DatabaseGeneratedOption.None)] 它什么也没做。
【解决方案2】:

您可以尝试在您的DbContext 中覆盖OnModelCreating 并手动指定您的关系。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<PersonRelative>()
       .HasOne(p => p.Person)
       .HasForeignKey<int>(p => p.PersonId);          
}

在此处阅读有关键和关系的更多信息:https://docs.microsoft.com/en-us/ef/core/modeling/relational/fk-constraints

【讨论】:

  • 不是 EF Core 问题。
猜你喜欢
  • 2016-08-08
  • 1970-01-01
  • 1970-01-01
  • 2015-01-15
  • 1970-01-01
  • 2012-01-24
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
相关资源
最近更新 更多