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; }
}

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の問題ですか。それが私のものなら、どこが間違っているか教えてください。

ありがとうございました

4

1 に答える 1

0

私には、移行のバグのように見えます。コードがこれを台無しにする方法はありません。

しかし、複合主キーを使用しないことを強くお勧めします。特に、そのフィールドの 1 つがビジネス ドメインで意味を持つ場合 (どちらが意味をDivisionNo持つか) は使用しないでください。複合主キーを導入すると、これまで以上に複雑さが増します。それらはジャンクション テーブルでのみ発生する必要があります。

class/table を導入する必要があるようですDivisionDivNoの識別に追加する方法がわかりませんDepartmentDeptId同じ sと異なるsを持つ 2 つの部門がある場合DivNo、それはまったく異なる部門でしょうか?

于 2013-04-10T07:58:51.927 に答える