2016-05-16 9 views

答えて

1

POは理想的な一意の識別子なので、プライマリキーとしても使用することは理にかなっています。この場合、ID列の自動インクリメントの性質に依存するだけで済みます。

プライマリキーを作成できない、または作成しない場合は、並行性の問題に対処する必要があるため、ややこしいことがあります。つまり、データベースから最大のPO番号を照会し、それを増分してからレコードを保存する必要があります。ただし、その間に別のレコードが保存されている可能性があるため、そのレコードを考慮する必要があります。あなたの人生を楽にするためには、PO列が一意に設定されていることを確認する必要があります。そうすれば、同じPOを複数回使用しようとすると、あなたが捕まえることができる完全性エラーが発生します。 [starting PO number]は何の請求書がまだ作成されていなかった場合に発行された最初の発注番号となり

var lastPO = db.Invoices.OrderByDescending(o => o.po_number).Select(m => m.po_number).FirstOrDefault() ?? [starting PO number]; 
invoice.po_number = lastPO++; 

:次に、それはのような何かをするだけです。

次に、保存するときに、考えられる整合性エラーをキャッチしてそれに応じて対応する必要があります。私の脳は、あなたが捉えるべき厳密な例外には少し霧があります。一意的な制約違反を扱うことについてのドキュメントはかなり疎です。誰もがの更新の同時性について話したがっていますが、これはこれと同じではありません。しかし、それはかなり簡単に把握することができます。コードを実行し、目的の重複したPOを保存しようとします。あなたが得る例外は、あなたが捕まえるべき例外です。その後、キャッチブロックで、PO番号をインクリメントして再度保存しようとします。

明らかに、これは無限ループのビットです(実際には、PO数が非常に速く生成されて、少なくとも2回目の試行では得られないことはまれですが、 Pollyでは、何かが最終的に成功するまで無限に再試行したり、再試行したり、再試行するのにある程度の時間を待ったり、サーキットブレーカーを設定したりするなど、例外処理ポリシーを設定できるようにしています(詳細はPollyを参照してください)すべて最小限の労力で。

関連する問題