モデルファーストアプローチでプロジェクトを作成しました。モデルでは、エンティティ間の多対多の関係を宣言し、Musician
(Session
ある種のリハーサルまたはパフォーマンスを表します)。予想どおり、これにより、データベースに関係を処理するためのピボットテーブルが生成されましたが、中間テーブルのC#モデルクラスは生成されませんでした。したがって、私のSession
オブジェクトには、 :Musicians
として宣言されたコレクションがあります。ICollection
public virtual ICollection<Musician> Musicians { get; set; }
これはコンストラクターHashSet
でとして初期化されます:Session
public Session()
{
this.Musicians = new HashSet<Musician>();
}
さて、私のソリューションのどこか(重要な場合はMVCコントローラー内)で、既存のMusician
ものを特定のに割り当てたいSession
ので、次のコードを使用します。
Musician musician = db.Musicians.First(m => m.Id == selectedMusician);
session.Musicians.Add(musician);
db.SaveChanges();
呼び出された直後にsession.Musicians.Add(musician)
、ミュージシャンがコレクションに追加されていることを確認しましたが、呼び出しdb.SaveChanges
てもデータベースへの変更が保持されていないようです。
ちなみに、dbは私のすべてのモデルを含む私のリポジトリです。たとえば、このコードSession
はデータベースに新しいものを正常に追加します。
db.Sessions.Add(session);
db.SaveChanges();
この状況でオブジェクトをコレクションに追加する方法について誰かが私を正しい方向に向けることができれば、それは大きな助けになります。
乾杯
編集:問題はそれがコレクションであったという事実とは何の関係もなかったことがわかりました。投稿で述べたように、ASPMVCプロジェクトのコントローラークラスから変更/保存を試みていました。セッションオブジェクトはビューから渡されていましたが、このオブジェクトに加えた変更がデータベースに保持されないことがわかりました(まあ、ばかげているので、すぐにチェックする必要があります)。ビューによって渡されたオブジェクトは、コンテキスト(この場合は私のdbオブジェクト)から直接取得されていないため、単なるコピーのように見えます。Session
これを修正するために、変更が実際に保持されるオブジェクトにアクセスできるように、同じIDを持つオブジェクトのコンテキストを照会しました。