web-dev-qa-db-ja.com

Entity Framework4.1コードの最初の外部キーID

2つのエンティティが1対多で参照されています。エンティティフレームワークがテーブルを作成すると、2つの外部キーが作成されます。1つはFluent Interfaceで指定したキー用で、もう1つはICollection用です。重複する外部キーを取り除くにはどうすればよいですか?

public class Person
{
    public long RecordId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public string Username { get; set; }

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

public class Department
{
    public long RecordId { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Person> People { get; set; }
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Person>()
        .HasRequired(p => p.Department)
        .WithMany()
        .HasForeignKey(p => p.DepartmentId)
        .WillCascadeOnDelete(false);
}

ありがとう!

19
Lukasz

関連付けの多端を明示的に指定する必要があります。

modelBuilder.Entity<Person>()
    .HasRequired(p => p.Department)
    .WithMany(d => d.People)
    .HasForeignKey(p => p.DepartmentId)
    .WillCascadeOnDelete(false);

それ以外の場合、EFは2つの関連付けがあると想定します。1つは外部キーDepartmentDepartmentIdで公開されておらず、DepartmentクラスのナビゲーションプロパティPersonです。 Fluentコードで定義したように、公開されたナビゲーションプロパティPeopleに属しているが、公開されていない別の関連付けがPersonにあり、EFによって自動的に作成された外部キーがあります。これは、データベースに表示されるもう1つのキーです。

26
Slauma

デフォルトのCodeFirst規則は、DepartmentId外部キーを検出します。これは、従来型であるためです。 Fluentの定義を削除する必要があると思います。

modelBuilder.Entity<Person>()
    .HasRequired(p => p.Department)
    .WithMany()
    .WillCascadeOnDelete(false);
7
Ed Chapel

最善の方法は、Personクラスからdepartmentidプロパティを削除し、次のステートメントを追加することです。 MapKeyは、指定した名前で外部キー列を作成します

 modelBuilder.Entity<Person>().HasRequired(p =>  p.Department)
    .WithMany().Map(x=>x.MapKey("DepartmentId"))
    .WillCascadeOnDelete(false);
3
Kris