エンティティ フレームワークを使用して奇妙な問題に遭遇しましたが、何がモラルなのかわかりません。
作成、更新、および削除操作ごとに個別のコンテキスト オブジェクトを使用する必要がありますか?
一意の制約を持つエンティティがあります。別のスレッドから値を受け取り、それらをエンティティに格納してデータベースに保持したいと考えています。1 つの DbContext を使用していて、一意制約違反が原因でエンティティの追加が失敗した場合、有効なエンティティを保存しようとする以降のすべての試みも失敗します。これは、無効なエンティティがまだ DbContext のセットにあるためです。
問題は次のようになります。
/*
* m_context is a memeber variable of the class and created once
* new MyEntity("unique") => creates new entity and sets the unique attribute to the passed value
* the entity's key is set automatically
*/
//works fine
try { m_context.MyEntities.Add(new MyEntity("unique"); m_context.SaveChanges() } catch{}
//fails because of unique constraint violation => this is okay
try { m_context.MyEntities.Add(new MyEntity("unique"); m_context.SaveChanges() } catch{}
//fails, too => not okay and not expected
try { m_context.MyEntities.Add(new MyEntity("unique2"); m_context.SaveChanges() } catch{}
例外は System.Data.Infrastructure.DbUpdateException (エントリの更新中にエラーが発生しました) -> System.Data.UpdateException (エントリの更新中にエラーが発生しました) -> System.Data.SQLite.SQLiteException (列の制約に失敗しました ...は一意ではありません)
=> 上記のシナリオでは、別のコンテキスト (以下を参照) を使用して 2 回、1 回だけです。
問題はすべてのデータベース プロバイダーで発生し、SQLite とは関係ないと思います。
したがって、少なくとも 2 つの解決策があります。
- MyContext の DbSet から 2 番目のエンティティを手動で削除します
- 作成操作ごとに個別のコンテキストを使用する
私は2番目を使用する傾向があります。これは、チュートリアル/コードで多くの using ステートメントを見たからです。同じオブジェクトが大量に再作成された理由は理解できませんでしたが、これが理由かもしれません。これは本当ですか、それとも私は完全に間違っていますか。
この問題は、更新および削除操作にも存在します。また、失敗の別の理由として、外部キー違反が考えられます。
では、ここでのベストプラクティスは何ですか? 操作ごとにコンテキスト オブジェクトを分離しますか? しかし、その物体は本当に軽いのでしょうか? また、読み取り操作にも「操作ごとに 1 つのコンテキスト」を適用する必要がありますか?
すでに述べたように、修正は明らかですが、モラルは私には完全に明確ではなく、ここでのベストプラクティスは何かに興味があります. ありがとう!