2012-06-29 1 views
5

EFは一意のキー制約をサポートしていないため、Saveメソッド中に例外を捕捉し、エラーメッセージをユーザーに表示する必要があるようです。EF CodeFirst変更を保存中にデータベース例外を処理する

このアプローチの問題点は次のとおりです。

  • はどのように我々は(
  • 例外を投げたが、どのように我々は例外をスローした問題の種類を知っているレコードを知っています例:私は、同じ上の2つのユニーク制約を持つことができます記録なので、私は1つが壊れているユーザーに伝える必要があります)

DBMSは、これらの問題を解決する方法のSQLServer 2008

のですか?

答えて

2

ユーザーが変更を保存する前に、この入力を検証する必要があり、データベース内で一意である必要があります値入力できることを許可する場合:

if (context.Customers.Any(c => c.SomeUniqueProperty == userInput)) 
    // return to user with a message to change the input value 
else 
    context.SaveChanges(); 

をこれがユニーク制約を持つ値の場合ではないだけですプライマリキーがデータベースで自動生成されない場合は、既存のターゲットレコードまたはプライマリキー値を参照する必要がある外部キー値を入力することもできます。コンテキストがデータベーステーブル全体の内容を知らず、現在コンテキストにアタッチされているエンティティについてのみ認識するため、EFは後者の状況であなたを助けません。 EFでは、同じプライマリキーを持つ2つのオブジェクトをアタッチすることは禁じられていますが、同じユニークキー制約を持つ2つのオブジェクトが可能です。しかし、データベースへの変更を保存すると、主キー制約の違反に対して完全に保護されません。

AnyのチェックとSaveChangesの間に同じ値のレコードが入力された場合は、発生しない例外を処理できないとみなし、ユーザーに「予想されるエラーが発生しました。再び..."。ユーザーがもう一度試してみると、Anyのチェックが再び行われ、入力値を上記のコードから変更するためのより有用なメッセージが表示されます。

このようなユニークキー制約またはプライマリキー制約違反で返される例外は、一般的にはDbUpdateExceptionであり、内部例外の1つは、そのプロパティの1つとしてSQL Serverエラーコードを含むSqlExceptionになります。その他の詳細は、例外メッセージ "UNIQUE KEY制約IX_SomeUniqueProperty_Index ..."またはそれに類する違反でしか見つかりません。ユーザーがこの情報を理解し、それに応じて反応することが期待される場合は、それを表示することができます。そうしないと、管理者または開発者がバグやその他の問題の可能性があるかどうかを確認するためにこのメッセージを記録できます。

+0

私はバッチ更新を行っているので、これはCustomersで更新された/追加されたレコードを見つけ出す必要があり、同じ値を持つ既存のレコードがあるかどうかをチェックするために各レコードをループします。変更されたレコードが10件以上ある場合、パフォーマンスにどのような影響を与えるのかよく分かりません。または、この場合は例外をキャッチするほうがよいでしょうか?メッセージはローカライズされていなければなりません。したがって、OSがフランス語なら(もし私が間違っていなければ)メッセージがフランス語でもあり、依存できないので、IX_SomeUniquePropertyのメッセージ検索を行うプロシージャを作成する必要があるようです.... "違反..." – Goran

+0

@ゴラン:私は参照してください、しかし、私はまだ存在を確認するためのクエリを行います。あなたが言うように*更新*する必要がある場合は、挿入だけでなく、とにかくデータベースのエンティティをクエリする必要はありませんか?エンティティがすでにDBに入っているかどうかを知らなくても、更新と挿入のどちらかを決めることはできません。 – Slauma

+0

更新と挿入の間の決定は、EF自身によって行われます。Customersコレクションに追加したエンティティはすべて新しいレコードと見なされ、すでに割り当てられているPKを持つレコードは更新されます。私がカバーする必要があるのは、ネットワーク上のユーザーがレコードを追加した場合です(クライアントのデータはほとんどの場合、データベースデータで最新ではないため、再同期が必要です)。最後の15分データの読み込み、および変更の保存を行います。このため、クライアントにキャッシュされているデータに依存して唯一の(または他の)制約があるかどうかを確認することはできません。 – Goran

関連する問題