【问题标题】:EF6 generates weird foreign keysEF6 生成奇怪的外键
【发布时间】:2021-11-22 17:29:57
【问题描述】:

我在使用 EF 6 时遇到了一点问题。这些是我的模型(好吧,我省略了不相关的属性):

[Table("Departments")]
public class Department
{
    public string Id { get; set; }

    public string Name { get; set; }
    public string Description { get; set; }

    public IList<Staff> Staff { get; set; }

    public Staff HOD { get; set; }
}

[Table("Staff")]
public class Staff
{
    [Key]
    public string EmployeeId { get; set; }

    public string Name { get; set; }

    public Department Department { get; set; }
}

这是 EF6 正在生成的迁移(嗯,只是创建方法):

CreateTable(
    "dbo.Staff",
    c => new
        {
            EmployeeId = c.String(nullable: false, maxLength: 128),
            Name = c.String(),
            Department_Id = c.String(maxLength: 128),
            Department_Id1 = c.String(maxLength: 128),
        })
    .PrimaryKey(t => t.EmployeeId)
    .ForeignKey("dbo.Departments", t => t.Department_Id)
    .ForeignKey("dbo.Departments", t => t.Department_Id1)
    .Index(t => t.Department_Id)      //what's this?
    .Index(t => t.Department_Id1);    //what's this?

CreateTable(
    "dbo.Departments",
    c => new
        {
            Id = c.String(nullable: false, maxLength: 128),
            Name = c.String(),
            Description = c.String(),
            HOD_EmployeeId = c.String(maxLength: 128),
        })
    .PrimaryKey(t => t.Id)
    .ForeignKey("dbo.Staff", t => t.HOD_EmployeeId)
    .Index(t => t.HOD_EmployeeId);

看看生成的外键。似乎有些不对劲。我该如何纠正这个问题?

【问题讨论】:

  • 您的数据库上下文的OnModelCreating 方法覆盖中有任何代码吗?迁移生成的命名约定看起来不是很标准,这让我假设您有一些自定义代码在某处覆盖了模型构建器。
  • RemovePluralizingTableNameConvention
  • 向 Department 添加一个可为空的 HODId 列并将其配置为 HOD 的 FK。

标签: c# asp.net-core-mvc entity-framework-6


【解决方案1】:

尝试添加一些关系

[Table("Departments")]
public class Department
{
    public string Id { get; set; }

    public string Name { get; set; }
    public string Description { get; set; }

    public virtual IList<Staff> Staff { get; set; }

     public  int HodId {get set;}

     [ForeignKey("HodId")]
    public Staff Hod { get; set; }
}

[Table("Staff")]
public class Staff
{
    [Key]
    public string EmployeeId { get; set; }

    public string Name { get; set; }

    public int DepartmentId { get; set; }

    public virtual Department Department { get; set; }
}

【讨论】:

  • 它仍然在 Staff 表上添加了 2 个外键,而应该只有一个
  • 是否可以使用 Fluent API 做到这一点?
【解决方案2】:

我必须使用 Fluent API 来建立这种关系:

modelBuilder.Entity<Staff>()
    .HasRequired<Department>(staff => staff.Department)
    .WithMany(department => department.Staff)
    .HasForeignKey<string>(staff => staff.DepartmentId);

模型变化:

public Department Department { get; set; }

改为

public string DepartmentId { get; set; }
public virtual Department Department { get; set; }

public IList<Staff> Staff { get; set; }

public Staff HOD { get; set; }

改为

public virtual IList<Staff> Staff { get; set; }

public Staff HOD { get; set; }

【讨论】:

  • DVing,DVer有什么特殊原因吗?
  • 我没有投反对票,但如果答案包含更正的模型/配置,而不仅仅是更改,那就更好了。
  • 嗯,模型实际上是一样的!为什么会有所不同?如果是的话,我肯定会在帖子中添加它:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多