質問
っていないので働いていSQL長すぎるかと思ったんですがその包装のSQLステートメント内の取引は、全ての完了したなかった。ここでは私の問題です。私ためのオブジェクトlineitemます。項目との関連に関す。Orderidトランザクション.していることを確認 すべてのIdの設定が正しい もしように保存す(挿入順)で取得しています のINSERTステートメントの葛藤の外部キー制約"FK_OrderItemDetail_Order".紛争の生じたデータベース"MyData"、テーブル"dbo.注"、カラム'orderidトランザクション'.
psuedoコード:
create a transaction transaction.Begin() Insert order Insert order.LineItems <-- error occurs here transaction.Commit
実際のコード:
... entity.Validate(); if (entity.IsValid) { SetChangedProperties(entity); entity.Install.NagsInstallHours = entity.TotalNagsHours; foreach (OrderItemDetail orderItemDetail in entity.OrderItemDetailCollection) { SetChangedOrderItemDetailProperties(orderItemDetail); } ValidateRequiredProperties(entity); TransactionManager transactionManager = DataRepository.Provider.CreateTransaction(); EntityState originalEntityState = entity.EntityState; try { entity.OrderVehicle.OrderId = entity.OrderId; entity.Install.OrderId = entity.OrderId; transactionManager.BeginTransaction(); SaveInsuranceInformation(transactionManager, entity); DataRepository.OrderProvider.Save(transactionManager, entity); DataRepository.OrderItemDetailProvider.Save(transactionManager, entity.OrderItemDetailCollection); if (!entity.OrderVehicle.IsEmpty) { DataRepository.OrderVehicleProvider.Save(transactionManager, entity.OrderVehicle); } transactionManager.Commit(); } catch { if (transactionManager.IsOpen) { transactionManager.Rollback(); } entity.EntityState = originalEntityState; } } ...
誰かが私を利用する必要が二つの取引は、一つの項目だそうですが、私は合理的に確ではないでしょうか。がんと闘うこと以上に渡日かる覚悟が必要であるかと移行する場合であっても使用することは悪いです。私もうっか?
解決
私はあなたがあなたのコード生成のためのNetTiersを使用していたと述べたことに気づきました。
私はNetTiers自分自身を使用しました、あなたは、あなたのテーブルからあなたの外部キー制約を削除して、同じテーブルに戻ってそれを追加し、データベースに変更を行った後、再度NetTiersのためのビルドスクリプトを実行する場合はリセットに役立つかもしれないことを発見しましたデータアクセス層。私は肯定的な結果を機会に、これを試してみた。
あなたの問題を持つ幸運ます。
他のヒント
を見ることなくコマンドながっているとは言い難いう問題です。できたらいいなと思うことはたくさんで探してみるのはいかがでしょう:
- これは当然のことですが、お二insertコマンドと同じ接続を接続飲み物を楽しみながらおくつろぎの時間を所有する取引。
- お取得IDに関する制約の挿入、書く時代に突入したと言われているデータのための半挿入を実行する前に、コマンド?
- の制約することができ間違えました。
ま利用しない。
は正しく順番に値を設定していないつまり、lineItemsのためのあなたの挿入文のように見える。これはInsert order
ステップの結果でなければなりません。あなたは、個々のSQL文を見て(とテスト)がありますか?
私はあなたの問題は、トランザクション制御を行うには何も持っていないと思います。
私はこの経験がないが、あなたは親テーブルで使用できないキー値を指定している可能性があるように見えます。申し訳ありませんが、私はあなたにこれ以上を助けることはできません。
問題は、あなたがエラーを処理する方法です。エラーが発生した場合、トランザクションは自動的にロールバックされません。あなたは確かに(そしておそらくすべきである)ことを行うことを選択することができますが、あなたのアプリや場所に応じて、あなたはまだそれをコミットする必要があります。そして、この場合には、それはあなたがやっているまさにそれです。あなたは、エラーが発生したときにあなたのコードをロールバックするために周りにそこにいくつかのエラー処理コードをラップする必要があります。
エラーがLineItemsには与えられていないことをのように見える適切なの のFK OrderIdでのの注文表にするための挿入により自動生成されたもの。あなたは、あなたにも注文の詳細にFKSを確認しました、あなたはのIdsをチェックしていると言いますか?