0

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 エンティティの。)

4

2 に答える 2

0

外部キー制約を定義していません。

.HasRequired(t => t.Manager)
.WithMany()
.HasForeignKey(t => t.ManagerId)

補足として。マネージャーが複数のチームを管理している場合、WithManyマネージャー.WithMany(m => m.Teams)モデルには次のようなものが必要になります。

private ICollection<Team> _teams
public ICollection<Team> Teams 
{
    get { return _teams ?? (teams = new List<Team>()); }
    protected set { _teams = value; }
}

整形してごめんなさい。自分の携帯電話に。幸運を。

于 2014-09-03T04:52:32.570 に答える