次の構成でEF Code Firstを使用しています
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<UserProfile>()
.HasMany(x => x.TeamLeaders)
.WithMany()
.Map(m => m.MapLeftKey("UserId")
.MapRightKey("TeamLeaderId")
.ToTable("UserTeamLeaders"));
}
TeamLeaders は User の ICollection です。つまり、自己参照する多対多の関係です。
簡単に言えば、ユーザーは複数のチーム リーダーを持つことができます。この構成は正しいように見えます。予想どおり、決闘 FK/PK リンク テーブルが作成されるからです。
コレクションからチーム リーダーを編集、追加、および削除できる MVC4 アプリケーションがあります。
私のコントローラーには、もともと次のものがありました。
var original = context.UserProfiles
.Include("TeamLeaders")
.Single(x => x.UserId == model.UserId);
context.Entry(original).CurrentValues.SetValues(model);
ただし、その最後の行では TeamLeaders コレクションを更新済みとしてマークできず、SaveChanges() を呼び出したときに変更が記録されませんでした。
代わりに、リフレクションを使用して手動でプロパティをコピーする User クラスに単純な CopyProperties メソッドを作成したため、コントローラーには次のように記述されています。
var original = context.UserProfiles
.Include("TeamLeaders")
.Single(x => x.UserId == model.UserId);
//context.Entry(original).CurrentValues.SetValues(model);
original.CopyProperties(model);
ただし、これは行き過ぎで、SaveChanges は、選択したチーム リーダーのプロファイルに一致する新しいユーザーをシステムに追加しようとします。
これのどの部分が間違っているかについて誰かアドバイスできますか? マッピングを更新する必要があるのか、ビュー モデルからモデルにプロパティをコピーする方法を変更する必要があるのか わかりません