我有以下型号
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; }
}
现在我想创建一个复合主键,DeptId
和DivNo
作为部门的键。
我在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问题。如果是我的,请告诉我我错在哪里。
谢谢
答案 0 :(得分:0)
对我而言,它看起来像是迁移中的一个错误。你的代码无法解决这个问题。
但我的强烈建议是,当其中一个字段在业务域中具有含义(DivisionNo
具有?)时,不会使用复合主键尤其。复合主键通过引入它们会增加复杂程度。它们只应出现在联结表中。
看起来你应该引入一个类/表Division
。我没有看到DivNo
如何添加Department
的标识。如果您有两个具有相同DeptId
和不同DivNo
的部门,那么这些部门会完全不同吗?