2017-06-06 13 views
0

SQL Serverデータベースを操作するのにC#とEFを使用しています。C#でEntity Frameworkを使用した複数のクエリ

一度に複数のクエリを実行する必要があります。今のところ私はすべての操作を一緒にやっています。最後にすべての変更を一度に適用するように関数DbContext.SaveChangesを呼び出しています。

私の問題は、いずれかのクエリにエラーがあると、すべてのクエリがキャンセルされるということです。

この場合、クエリごとにDbContext.SaveChangesに電話する必要がありますか?

おかげ

+2

おそらく、トランザクションを使用する方が良いでしょうか?エラーが発生すると、トランザクションのすべてがロールバックされ、データが破損することはありませんか? –

+0

https://stackoverflow.com/questions/815586/using-transactions-or-savechangesfalse-and-acceptallchangesこのリンクを確認してください –

+0

メモと同様に、ほとんどの場合、これは良いことです。予期せぬ状態でデータを保持することの意義を注意深く検討する必要があります。 – Paddy

答えて

2

DBcontextはUnitOfWorkとして機能します。それは現在のDBContextのすべての変更を追跡し、SaveChangesを呼び出すとをデータベースに書き込む際に正確に何をすべきかを判断します。つまり、これはデータベーストランザクションに似ています。

すべてのクエリでDbContext.SaveChangesを呼び出す必要がありますか?

によって異なります。 UnitOfWorkを特定する必要があります。 Webアプリケーションでは、一般に「リクエストごとのDBConstext」です。それはまさにあなたのためではないかもしれません。 1つのグループで実行する必要があるDBアクションのグループを特定するか、グループとして失敗する必要があります。それに応じてSaveChangesに電話してください。

DBコールごとにSaveChangesを呼び出すと効率的でない場合があります。あなたはORMの他の重要な機能を無視していますが、この場合は役立たないでしょう。 UnitOfWorkを特定する時間を取ってください。

+0

私はオブジェクトの配列を含むjsonを取得していますが、dbに挿入する必要があります。 \t すべてのクエリでdbにアクセスすることは効率的ではありませんか? – amichai

+0

IMOでは、配列内のすべての項目を単一グループのDBに挿入する必要があります。これを行う際にエラーが発生した場合は、事前にデータを検証してください。 –

+0

データを検証するには、既存のデータをチェックするためにdbにアクセスする必要がありますが、エラーは非常に稀で、欠陥のあるオブジェクトを失うことを好みます。 – amichai

0

はい、あなたが正常にクエリを実行するすべてのクエリの後DBcontext.SaveChangesを呼び出すことができます。クエリにエラーがあり、残っている作業が保存されている場合は、依存関係がない場合は、実行の終了時にエラークエリを に入れてください。

+0

そうするのは非効率的ではありませんか? – amichai

+0

エラーを修正して、一度だけ使用してください。 –

1

トランザクションが不要な場合は、すべてのクエリに対してDbContext.SaveChangesを呼び出す必要があります。

関連する問題