Entity Framework 4.3 Code Firstを使用しています。多対多リレーションシップの更新に問題があります。Entity Frameworkの多対多リレーションシップを更新できません
私は、次のクラス定義された:
public abstract class Entity
{
[Column(Order = 0)]
[Key]
public int Id { get; set; }
[Timestamp]
[Column(Order = 1)]
public byte[] Version { get; set; }
}
public class Video : Entity
{
public string Title { get; set; }
public string Description { get; set; }
public TimeSpan Length { get; set; }
public virtual ICollection<Coworker> Coworkers { get; set; }
}
public class Coworker : Entity
{
public string FirstName { get; set; }
public string LastName { get; set; }
public virtual ICollection<Video> Videos { get; set; }
}
データベースが作成されると、スキーマは右を見て: ビデオ、同僚やVideoCoworkersテーブルがあまりにもあり、
せずに私は、リポジトリのパターンを使用しますデータベースにアクセスするためのN層アプリケーションは、私の挿入および更新方法は、次のようになります。私は、エンティティを更新すると
public T Insert(T entity)
{
//Creates database context. When it disposes, it calls context.SaveChanges()
using (var session = new DatabaseSession())
{
session.Context.Set<T>().Add(entity);
}
}
public T Update(T entity)
{
//Creates database context. When it disposes, it calls context.SaveChanges()
using (var session = new DatabaseSession())
{
entity = session.Context.Set<T>().Attach(entity);
session.Context.Entry(entity).State = EntityState.Modified;
}
return entity;
}
、私はCRエンティティオブジェクトをDTOから削除する必要があります。そのため、DbSet.Attachを選択してプロパティを1つずつ更新するのではなく、その代わりに使用します。
私は、データベースを初期化すると、私はいくつかのテストデータを追加します。
- は、私が最初と最後の名前を設定する3人の同僚を作成します。 (A、B、C)
- 3つのビデオを作成し、タイトル、説明、長さを設定し、同僚を設定します。最初のビデオにはA、B、2番目にB、C、3番目にA、Cがあります。
私はコードからビデオを一覧表示するとき、私はVideo.Coworkersコレクションは良好な値で満たされていることがわかります、と私はSQL Server Management Studioで(VideoCoworkers)リンクテーブルを照会するとき、それはまた、よさそうです。
私の問題は たとえばビデオのタイトルを更新すると動作します。しかし、既存の同僚(BとC)をVideo2から削除しようとすると、同僚Aを追加しようとすると、関係は更新されません。また、私は新しい同僚を追加しようとするとき、または削除しようとするときにのみ機能しません。私は、Update()メソッドのパラメータとして使用されるエンティティを作成します。これは、新しいVideoエンティティを、Find()メソッドを使用してIdからデータベースから選択された新しい同僚のコレクションで作成することによって作成されます。
多対多リレーションシップを更新する正しい方法は何ですか?
あなたはビデオから同僚をどのように削除するかは分かりませんが、ビデオの同僚のコレクションをループして、削除したDTOに一致するアイテムをマークする必要があります。 –