0

どうやら私はまだEFを十分に理解していません。ここ SO の誰かが、アプリケーションの存続期間中はコンテキスト オブジェクトを開いたままにしないように提案したので、少し変更しました。現在の動作は次のとおりです。

  1. EF を使用して DB から必要なデータを読み取り、ObservableCollection(Of MyEntity).
  2. アプリケーションは、このコレクションに新しいオブジェクトを追加し続け、ObservableCollection 内の既存のオブジェクトを変更/削除します。
  3. アプリケーションの終了時または [保存] ボタンで、変更を 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 の「切断」モードでどのように作業するのですか?

4

1 に答える 1

0

自分で見つけました。Modified 状態のコードは正しいです。新しいオブジェクトの場合、次のようになります。

If entity.EntityState = EntityState.Added OrElse entity.EntityState = EntityState.Detached Then
    context.FilmTypes.AddObject(entity)

key パラメータを指定する必要はありません。EFが担当します。

于 2013-03-24T07:03:56.460 に答える