どうやら私はまだEFを十分に理解していません。ここ SO の誰かが、アプリケーションの存続期間中はコンテキスト オブジェクトを開いたままにしないように提案したので、少し変更しました。現在の動作は次のとおりです。
- EF を使用して DB から必要なデータを読み取り、
ObservableCollection(Of MyEntity)
. - アプリケーションは、このコレクションに新しいオブジェクトを追加し続け、ObservableCollection 内の既存のオブジェクトを変更/削除します。
アプリケーションの終了時または [保存] ボタンで、変更を DB に送信しようとしましたが、明らかにできません。提出コードはこちら。
For Each entity In MyObservableCollection If entity.EntityState = EntityState.Added OrElse entity.EntityState = EntityState.Detached Then Dim key = context.CreateEntityKey(entitySetName, entity) entity.EntityKey = key context.FilmTypes.Attach(entity) ElseIf entity.EntityState = System.Data.EntityState.Modified Then Dim originalItem As Object = Nothing Dim key = context.CreateEntityKey(entitySetName, entity) If context.TryGetObjectByKey(key, originalItem) Then context.ApplyCurrentValues(key.EntitySetName, entity) End If End If Next context.SaveChanges(SaveOptions.AcceptAllChangesAfterSave)
EF は、同じキーを持つオブジェクトが既に存在することを教えてくれます。私の PK 列はモデルの Identity として定義されているため、一時キーが自動生成されることを期待しています (古い適切な DataSet が行ったように)。
EF の「切断」モードでどのように作業するのですか?