エンティティフレームワークコアでは、熱狂的な関係をモデル化することが不可欠です。遭遇すると、同じテーブルに複数の外部キーを持つモデルを作成すると、異常を引き起こす可能性があります。
あなたの例では、チームとチームの1つの関係を獲得するためにチームを定義し、1つのホームチームとゲストチームが含まれます。ただし、最初の方法では、サイクルの参照異常がトリガーされます。
この問題を解決するには、hasRequired()およびwithmany()およびwithmany()メソッドのスムーズなAPI構成、およびwithmany()メソッドとonmodelcreating()を使用する必要があります。これは更新されたモデルです:このモデルでは
:
public class Team { public int TeamId { get; set; } public string Name { get; set; } public virtual ICollection<Match> HomeMatches { get; set; } public virtual ICollection<Match> AwayMatches { get; set; } } public class Match { public int MatchId { get; set; } public int HomeTeamId { get; set; } public int GuestTeamId { get; set; } public float HomePoints { get; set; } public float GuestPoints { get; set; } public DateTime Date { get; set; } public virtual Team HomeTeam { get; set; } public virtual Team GuestTeam { get; set; } } public class Context : DbContext { // ... protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Match>() .HasOne(m => m.HomeTeam) .WithMany(t => t.HomeMatches) .HasForeignKey(m => m.HomeTeamId) .OnDelete(DeleteBehavior.Restrict); // or DeleteBehavior.NoAction modelBuilder.Entity<Match>() .HasOne(m => m.GuestTeam) .WithMany(t => t.AwayMatches) .HasForeignKey(m => m.GuestTeamId) .OnDelete(DeleteBehavior.Restrict); // or DeleteBehavior.NoAction } }
チームエンティティには、ホームマッチとアウェイマッチの2つの競技が含まれます。
OnDelete(DeleteBehavior.Restrict)
DeleteBehavior.NoAction
この方法により、EF Coreモデルの同じテーブルに複数の外部キーを確立することができます。 新しいEFコアバージョンではが放棄されていることに注意してください。データベース提供プログラムの動作に応じて、関連するレコードが存在しない限り、削除操作を防ぎます。 特定のニーズに依存するものを選択します。 WillCascadeOnDelete(false)
以上が最初にエンティティフレームワークコードで同じテーブルに複数の外国のキーを処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。