新しいタイプの製品を作成し、その製品にいくつかの成分を加えることができるアプリケーションがあります。製品と成分は両方ともデータベースに保存されたエンティティです。製品エンティティは、成分エンティティの集合を有する。エンティティ4.1新しい子エンティティを使用して既存の親エンティティを更新する
(簡易版)
public class Product
Public Sub New()
Me.Ingredients = New List(Of Ingredient)()
End Sub
Property Ingredients as ICollection(Of Ingredient)
end class
私が初めて製品を保存、すべてがうまく行く:私はちょうどコンテキストに追加し、SaveChangesメソッドを呼び出します。
myDataContext.Products.Add(product)
myDataContext.SaveChanges()
製品(親)と成分(子供)は、互いに保存され、リンクされています。すべては順調です。
しかし、既存の製品に成分を追加/除去すると、問題が発生し始めます。私はまず、製品エンティティの既存の成分のコレクションをクリアしてから、成分の更新されたリストをもう一度追加します(私は成分を再使用しないで瞬間を追加します)。次に、製品エンティティの状態を変更してsavechangesを呼び出します。ただし、状態Iを変更すると、例外「、同じキーを持つオブジェクトがすでにObjectStateManagerに存在します」を取得します。 「いくつかは、」私は問題はすべての成分は、(彼らはまだ追加されていないとして)0の主キーを持っていて、親エンティティの状態を変更(製品ということであることを考え出し検索した後
myDataContext.Entry(product).State = EntityState.Modified
)、すべての子エンティティ(成分)がキーが0であるコンテキストにアタッチされているため、キーがもはや一意ではないため、問題が発生します。
私は解決策を探していますが、この問題を解決する方法を見つけることはできません。状態を変更する前にコンテキストに要素を追加しようとしましたが、製品と要素の間のリンクが見つかりません...既存の親エンティティを、まだ追加されていない新しい子エンティティに更新するにはどうすればよいですか?
私は、Entity Framework 4.1とコードファーストを使用します。
私を助けることができますように!
これは完全に完璧に動作します!ありがとう! – DirkDooms
エンティティを正しく更新する方法を知りました。 context.Entry(productInDb).CurrentValues.SetValues(product);ありがとうございます。 –
これは素晴らしく、今はリフレクションで動作させる方法を理解するだけで、保存しているエンティティのすべてのコレクションをループすることができます。 – Nikkoli