Code First を使用して Entity Framework で双方向の 1..n 関係を実装する方法を理解しようとして、私は完全に困惑しています。たとえば、チーム (Team エンティティで表される) には、コーチとマネージャー (両方とも Person エンティティで表される) がいます。したがって、私のチーム モデルは次のようになります。
public class Team
{
public Team()
{
Manager = new Person();
Coach = new Person();
}
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int TeamID { get; set; }
public string Name { get; set; }
[ForeignKey("Manager")]
public int ManagerID { get; set; }
public virtual Person Manager { get; set; }
[ForeignKey("Coach")]
public int CoachID { get; set; }
public virtual Person Coach { get; set; }
}
次のように Person エンティティを実装することで、一方向ナビゲーションを実装できます。
public class Person
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int PersonID { get; set; }
public string Name { get; set; }
}
流暢な API:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Team>()
.HasRequired(t => t.Manager);
modelBuilder.Entity<Team>()
.HasRequired(t => t.Coach);
base.OnModelCreating(modelBuilder);
}
ただし、これにより、チーム エンティティから関連するコーチとマネージャー (どちらも Person のインスタンス) に移動できますが、コーチまたはマネージャーから関連するチームに直接移動することはできません。そこで、双方向ナビゲーションを実装するために、Person エンティティを次のように変更しました。
public class Person
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int PersonID { get; set; }
public string Name { get; set; }
[ForeignKey("Team")]
public int TeamID { get; set; }
public virtual Team Team { get; set; }
}
ビルドは問題ありませんが、データベースに保存しようとすると、次のランタイム エラーが発生します。
System.Data.Entity.Core.UpdateException
InnerException: Unable to determine a valid ordering for dependent operations. Dependencies may exist due to foreign key constraints, model requirements, or store-generated values.
そこで、エンティティ間の順序を指定するために、次のように「WithRequiredPricipal」を追加して流暢な API を変更しようとしました。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Team>()
.HasRequired(t => t.Manager)
.WithRequiredPrincipal(t => t.Team);
modelBuilder.Entity<Team>()
.HasRequired(t => t.Coach)
.WithRequiredPrincipal(t => t.Team);
base.OnModelCreating(modelBuilder);
}
ただし、パッケージ マネージャー コンソールで「add-migration」を実行しようとすると、次のエラーが発生します。
System.InvalidOperationException: The navigation property 'Team' declared on type 'RelatedEntities.Models.Person' has been configured with conflicting foreign keys.
私が達成しようとしていることは単純な要件のように思えますが、まだ答えを見つけることなく解決策を探し続けてきました。流暢な API または注釈で何か不足していますか?
(チームには他にも多くの役割 (アシスタント コーチ、広報マネージャーなど) がある可能性があるため、コーチとマネージャーに別々のモデルを実装するなどの回避策を実装したくありません。それぞれを単にインスタンスにしたいです) Person エンティティの。)