あるモデルに2つのナビゲーションプロパティを作成する方法(最初にEF6コード)
-
21-12-2019 - |
質問
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);
}
. 所属していません StackOverflow