私はリポジトリパターンを使用しています。Entity Framework:送信前に値が存在するかどうかをチェックする方法
提出するサービスを使用している国のレポジトリがあります。その国が既にデータベースに存在するかどうかを確認するには、どこに例外を投げますか?
1つのデータベース呼び出しでこれを行う方法はありますか? (存在しない場合は、チェックして挿入してください)?これが可能であれば、それはサービス層で行うことができますか? (それが私が小切手をすることをお勧めする場所ならば)。
私はリポジトリパターンを使用しています。Entity Framework:送信前に値が存在するかどうかをチェックする方法
提出するサービスを使用している国のレポジトリがあります。その国が既にデータベースに存在するかどうかを確認するには、どこに例外を投げますか?
1つのデータベース呼び出しでこれを行う方法はありますか? (存在しない場合は、チェックして挿入してください)?これが可能であれば、それはサービス層で行うことができますか? (それが私が小切手をすることをお勧めする場所ならば)。
、あなたは何の問題を保証できませんSELECT
、その後INSERT
とすることができます。 @Coding Gorillaによって提案されたソリューションは、並行性の高い状況で失敗する可能性があります。
適切なDB列にUNIQUE
インデックスを置き、その国が存在する場合に得られるDB例外を処理します(または、表面にします)。はい、サービス層でこれを行うことができます。これは1つのDB呼び出しであり、DBサーバーが同時実行性の問題からユーザーを保護するため、決して失敗しません。
サービスやリポジトリにこの種のロジックを入れるかどうかは、主観的な質問です。個人的に私はサービスチェックを行い、それが存在しない場合は挿入しますが、リポジトリが存在しないことをリポジトリに確認させてから、リポジトリがデータベースを妨げるいくつかの "ロジック"を強制します二等辺三角形に満ちるから
どうすればよいですか?
ため、マルチユーザーの同時実行性のpublic void InsertIfNonExistant(string Country)
{
if(!_myContext.Countries.Any(c=>c.Name == Country))
InsertNewCountry(Country);
}
あなたはEFがエラーをスローし、単にサービスレイヤーの挿入を呼び出すと言っていますか?私はどんな小切手も書く必要はありませんか? –
DBサーバーは、UNIQUE制約に違反するとエラーを返します。これが起こるとEFがスローされます。 –