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);
}
ありがとう!
関連付けの多端を明示的に指定する必要があります。
modelBuilder.Entity<Person>()
.HasRequired(p => p.Department)
.WithMany(d => d.People)
.HasForeignKey(p => p.DepartmentId)
.WillCascadeOnDelete(false);
それ以外の場合、EFは2つの関連付けがあると想定します。1つは外部キーDepartment
とDepartmentId
で公開されておらず、Department
クラスのナビゲーションプロパティPerson
です。 Fluentコードで定義したように、公開されたナビゲーションプロパティPeople
に属しているが、公開されていない別の関連付けがPerson
にあり、EFによって自動的に作成された外部キーがあります。これは、データベースに表示されるもう1つのキーです。
デフォルトのCodeFirst規則は、DepartmentId外部キーを検出します。これは、従来型であるためです。 Fluentの定義を削除する必要があると思います。
modelBuilder.Entity<Person>()
.HasRequired(p => p.Department)
.WithMany()
.WillCascadeOnDelete(false);
最善の方法は、Personクラスからdepartmentidプロパティを削除し、次のステートメントを追加することです。 MapKeyは、指定した名前で外部キー列を作成します
modelBuilder.Entity<Person>().HasRequired(p => p.Department)
.WithMany().Map(x=>x.MapKey("DepartmentId"))
.WillCascadeOnDelete(false);