あるモデルに2つのナビゲーションプロパティを作成する方法(最初にEF6コード)

StackOverflow https://stackoverflow.com//questions/20020531

質問

EF6コードの最初の規則を使用して、同じテーブルに2つの外部キーを持つモデルを作成します。たとえば、今、私はチームモデル:

public class Team
{
    public Guid Id { get; set; }
    public String Name { get; set; }

    public virtual ICollection<Match> Matches { get; set; }
}
.

match モデル:

public class Match
{
    public Guid Id { get; set; }
    public Int32 TeamHomeScore { get; set; }
    public Int32 TeamAwayScore { get; set; }

    public Guid TeamHomeId { get; set; } // I want these properties to be foreign keys
    public Guid TeamAwayId { get; set; } //

    public virtual Team TeamHome { get; set; }
    public virtual Team TeamAway { get; set; }
}
.

しかし、プロジェクトを実行した後、次の例外を持っています:

表の「一致」の「FK_DBO.MATCHES_DBO.TEAMS_TEAMHOMEID」の紹介は、サイクルまたは複数のカスケードパスを引き起こす可能性があります。Delete No ActionまたはUpdate On Action On Actionまたは他の外部キーの制約を変更します。 制約を作成できませんでした。

推奨事項?

役に立ちましたか?

解決

SQL Serverは複数のカスケードパスを処理できないため、エラーを返しています。複数のパスは、多くの team プロパティを持つ match>です。

Cascade On DeleteをFalseに設定します。

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Match>()
                    .HasRequired<Team>(i => i.TeamHome)
                    .WithMany(i => i.Matches)
                    .WillCascadeOnDelete(false);

        base.OnModelCreating(modelBuilder);
    }
.

カスケード削除がないので、チーム自体を削除する前に最初にチームの一致を削除する必要があります。

他のヒント

移行を使用している場合は、これを試してください。移行は毎回スマートではありません、あなたは時々コードを相互にまとめるべきです。

public class Match
{
    public Guid Id { get; set; }
    public Int32 TeamHomeScore { get; set; }
    public Int32 TeamAwayScore { get; set; }

    public Guid TeamHomeId { get; set; } // I want these properties to be foreign keys
    public Guid TeamAwayId { get; set; } //

    [ForeginKey("TeamHomeId")]
    public virtual Team TeamHome { get; set; }
    [ForeginKey("TeamAwayId")]
    public virtual Team TeamAway { get; set; }
}
.

それからあなたはあなたのdatacontex.cs

に下記を追加します。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
modelBuilder.Entity<Match>()
               .HasRequired(a => a.TeamHome )
               .WithMany()
               .HasForeignKey(u => u.TeamHomeId);

modelBuilder.Entity<Match>()
               .HasRequired(a => a.TeamAway )
               .WithMany()
               .HasForeignKey(u => u.TeamAwayId);
}
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top