私はある日、成功せずに解決策を見つけるために投資していました。
単純な多対多の関係を作成するのが好きです。
そのために、2 つのモデルを作成しました。
どのターンがプレーヤーを訪問したかを確認するための「ターン」ナビゲーション プロパティを持つプレーヤー クラス。
public class Player
{
[Key]
public Int64 PlayerId { get; set; }
public string FirstName { get; set; }
[Required]
public string Surename { get; set; }
public virtual ICollection<Turnament> Turnaments { get; set; }
}
そして、どのプレーヤーがターンの一部であるかを確認するための「プレーヤー」ナビゲーション プロパティを持つ Turnament クラス。
public class Turnament
{
[Key]
public int TurnamentId { get; set; }
[Required]
public string Name { get; set; }
public DateTime? StartDate { get; set; }
public DateTime? EndDate { get; set; }
public bool IsClosed { get; set; }
public virtual ICollection<Player> Players { get; set; }
}
VS2012 の「パッケージ マネージャー コンソール」ウィンドウでコマンド「upate-database」(automtic migratons = on) で移行を開始すると、次の例外が発生します。
テーブル 'PlayerTurnaments' に FOREIGN KEY 制約 'FK_dbo.PlayerTurnaments_dbo.Turnaments_Turnament_TurnamentId' を導入すると、サイクルまたは複数のカスケード パスが発生する可能性があります。ON DELETE NO ACTION または ON UPDATE NO ACTION を指定するか、他の FOREIGN KEY 制約を変更します。制約を作成できませんでした。以前のエラーを参照してください。
また、その例外の背景も理解しています。
したがって、エンティティ フレームワークに、削除する場合は次のように伝えます。
a) プレーヤー EF は、関連付けられたターナメントにカスケード デリートをプッシュしないでください。
b) Turnament EF は、関連付けられたプレーヤーにカスケード削除をプッシュする必要があります。
その背景では、サイクルパスはなくなりました。
そこで、Entity Framwork の流暢な API を介して「カスケード削除の切り替え」を実装しようとしました。
public class DataContext : DbContext
{
public DbSet<Turnament> Turnaments { get; set; }
public DbSet<Player> Players { get; set; }
protected override void OnModelCreating( DbModelBuilder modelBuilder )
{
//modelBuilder.Entity<Turnament>()
// .HasMany( b => b.Players )
// .WithMany( a => a.Turnaments )
// .Map( m => m.MapLeftKey( "PlayerPid" )
// .MapRightKey( "TurnamentPid" )
// .ToTable( "TurnamentsJoinPlayers" ) );
//modelBuilder.Entity<Player>().HasRequired( t => t.Turnaments ).
// WithMany().WillCascadeOnDelete( false );
//modelBuilder.Entity<Turnament>().HasRequired( t => t.Players ).
// WithMany().WillCascadeOnDelete( false );
//modelBuilder.Entity<Player>().HasRequired( t => t.TurnamentsRelation ).
// WithMany().HasForeignKey( p => p.PlayerId ).WillCascadeOnDelete( false );
//modelBuilder.Entity<Player>().HasMany(p => p.TurnamentsRelation).
base.OnModelCreating( modelBuilder );
}
}
しかし、あなたが見るように、それは助けにならないので、すべてが賞賛されます.
クラックだけが理解するいくつかのコードスニップだけが理解できるように、すべての有能なヘルプのためのthx :) PS:その種の多対多関係のEF5(最終)の解決策があると確信しています