Entity FrameworkのCreateOrUpdateメソッドでtry-catchに依存しても大丈夫ですか?
-
22-07-2019 - |
質問
これを行うことは許容されますか?最初にエンティティを追加してみてください。追加が失敗した場合、それはエンティティが既に存在することを意味するので問題ではありませんか?
または、よりエレガントで簡単な解決策はありますか?
EntityFrameworkEntities dal = EntityDataModelHelper.GetEntityDataModel();
try
{
dal.AddToXXXXXX(xxxxxxx);
}
catch
{
}
try
{
dal.SaveChanges();
return true;
}
catch
{
return false;
}
OK ...に短縮しました
EntityFrameworkEntities dal = EntityDataModelHelper.GetEntityDataModel();
if(xxxxxxx.ID == 0)
{
dal.AddToXXXXXX(xxxxxxx);
}
try
{
dal.SaveChanges();
return true;
}
catch
{
return false;
}
解決
これを行うのは確かにそうではありません。 C#で型のないcatchステートメントは、「標準または非標準の例外をキャッチする」ことを意味します。しかし、あなたが意図しているのは重複する追加を防ぐことです。追加は、既存のエントリを示すものではないさまざまな理由で失敗する可能性があります。たとえば、そのメソッドはnull参照をスローする可能性があり、追加されたと想定します。
重複した追加を確認する場合は、重複した追加に対してスローされた例外のみを強制する必要があります。
他のヒント
IfExistsスタイルメソッドから開始し、実際に変更がない限り、変更の保存をスキップします。
Lucasが述べたように、try-catchブロックはcatchブロックに陥ると大きなオーバーヘッドが発生するため、アイテムが既に存在するかどうかを判断する方法がない限り、一般的にこれに依存することは望ましくありません。
tryステートメントを使用してIfステートメントのジョブを実行しないでください。 Try-catchは、予期しない異常なイベント用です。
編集 更新されたコードでは、" AddToXXXXXX"によってスローされる例外をキャッチできません。メソッド。
実行する必要があります
If(!XXXXXX.Contains(newItemValue))
{
try
{
add...
savechanges...
}
catch
{
}
}
別の方法として、AddとSavechangesを異なるtry-catchブロックに分けることもできますが、Addが失敗してもSaveChangesが実行される場合にのみ必要です。
最初のTry-CatchをIfステートメントに置き換えることができますが、2番目のTry-Catchも必要になると思います。
編集:また、1つのブロック内のすべての例外を、それらが何であるかに関係なくキャッチすることはお勧めできません。
PS Try Catchブロックは、Ifステートメントよりも多くの処理能力(時間)を使用します。