0

我有以下型号

public class DeptContext : DbContext
{
    public DbSet<Department> Departments { get; set; }
    public DbSet<Employee> Employees { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<Employee>().HasKey(t => t.EmpId);
        modelBuilder.Entity<Department>().HasKey(t => t.DeptId);
    }
}

public class Department
{
    public int DeptId { get; set; }
    public int DivNo { get; set; }
    public string DeptName { get; set; }

    public List<Employee> Employees { get; set; }
}

public class Employee
{
    public int EmpId { get; set; }
    public int DivisionNo { get; set; }
    public int DepartmentId { get; set; }

    public Department Department { get; set; }
}

现在我想创建一个复合主键,DeptIdDivNo作为部门中的键。

我在 OnModelCreating() 中添加了以下代码

modelBuilder.Entity<Department>().HasKey(t => new {t.DeptId, t.DivNo});
modelBuilder.Entity<Employee>().HasRequired(t => t.Department)
                      .WithMany(g=>g.Employees)
                      .HasForeignKey(t => new { t.DepartmentId, t.DivisionNo });

我使用了迁移,以下是我得到的代码(只有 UP())

AlterColumn("dbo.Departments", "DeptId", c => c.Int(nullable: false));
DropPrimaryKey("dbo.Departments", new[] { "DeptId" });
AddPrimaryKey("dbo.Departments", new[] { "DeptId", "DivNo" });
AddForeignKey("dbo.Employees", new[] { "DivisionNo", "DepartmentId" }, "dbo.Departments", new[] { "DeptId", "DivNo" }, cascadeDelete: true);
CreateIndex("dbo.Employees", new[] { "DivisionNo", "DepartmentId" });

现在的问题是,当我在模型构建器中添加复合外键时,我没有得到现有外键的DropForeignKey语句,up()得到错误为

约束“PK_dbo.Departments”被表“Employees”引用,外键约束“FK_dbo.Employees_dbo.Departments_DepartmentId”。

这是代码问题还是 ef 问题。如果是我的,请让我知道我错在哪里。

谢谢你

4

1 回答 1

0

对我来说,这看起来像是迁移中的错误。你的代码不可能把这件事搞砸。

但我强烈的建议是不要使用复合主键,尤其是当其中一个字段在业务领域有意义时(哪个DivisionNo有?)。复合主键增加的复杂性比你通过引入它们所能获得的要多。它们应该只出现在联结表中。

看起来你应该介绍一个 class/table Division。我看不出如何DivNo添加到Department. 如果您有两个具有相同DeptId和不同DivNos 的部门,那会是完全不同的部门吗?

于 2013-04-10T07:58:51.927 回答