2010-12-17 3 views
0

私はリポジトリパターンを使用しています。Entity Framework:送信前に値が存在するかどうかをチェックする方法

提出するサービスを使用している国のレポジトリがあります。その国が既にデータベースに存在するかどうかを確認するには、どこに例外を投げますか?

1つのデータベース呼び出しでこれを行う方法はありますか? (存在しない場合は、チェックして挿入してください)?これが可能であれば、それはサービス層で行うことができますか? (それが私が小切手をすることをお勧めする場所ならば)。

答えて

1

、あなたは何の問題を保証できませんSELECT、その後INSERTとすることができます。 @Coding Gorillaによって提案されたソリューションは、並行性の高い状況で失敗する可能性があります。

適切なDB列にUNIQUEインデックスを置き、その国が存在する場合に得られるDB例外を処理します(または、表面にします)。はい、サービス層でこれを行うことができます。これは1つのDB呼び出しであり、DBサーバーが同時実行性の問題からユーザーを保護するため、決して失敗しません。

+0

あなたはEFがエラーをスローし、単にサービスレイヤーの挿入を呼び出すと言っていますか?私はどんな小切手も書く必要はありませんか? –

+0

DBサーバーは、UNIQUE制約に違反するとエラーを返します。これが起こるとEFがスローされます。 –

1

サービスやリポジトリにこの種のロジックを入れるかどうかは、主観的な質問です。個人的に私はサービスチェックを行い、それが存在しない場合は挿入しますが、リポジトリが存在しないことをリポジトリに確認させてから、リポジトリがデータベースを妨げるいくつかの "ロジック"を強制します二等辺三角形に満ちるから

どうすればよいですか?

ため、マルチユーザーの同時実行性の
public void InsertIfNonExistant(string Country) 
{ 
    if(!_myContext.Countries.Any(c=>c.Name == Country)) 
     InsertNewCountry(Country); 
} 
関連する問題