2016-07-21 4 views
2

SubmitChangesが失敗したときに、失敗したInsertOnSubmitの取り消しに問題があります。ここでは、コードです:彼らは再び提出するヒットすると失敗したInsertOnSubmitをロールバックするにはどうすればよいですか? (VB.NET LINQ)

Dim NewFac As New t_Facility With 
      {.FK_Instance_ID = guInstance_ID, 
      .FK_AccountType_ID = guAccountType_ID, 
      .FK_ATP_ID = guATP_ID, 
      .FK_Repayment_ID = guRepaymentType_ID, 
      .FK_InterestType_ID = guInterestType_ID, 
      .FK_FT_ID = guFacilitiesType_ID, 
      .NewRecord = bNewRecord, 
      .IndexNum = iIndexNum, 
      .SortCode = sSortCode, 
      .AccountNumber = sAccountNumber, 
      .Balance = decBalance, 
      .LastSanction = decLastSanctioned, 
      .Proposed = decProposed, 
      .Term_MTHs = iTerm_MTHS, 
      .Term_Expiry = dTerm_Expiry, 
      .InterestRate = decInterestRate, 
      .ArrangementFee = decArrangementFee, 
      .DateTime_From = Now(), 
      .ID = guFacilities_ID} 
    db.t_Facilities.InsertOnSubmit(NewFac) 
    Try 
     db.SubmitChanges() 
    Catch e As Exception 
     Console.WriteLine(e) 
     MessageBox.Show(e.Message & ". Please correct the field and try again", "ERROR", MessageBoxButton.OK, MessageBoxImage.Stop) 

     Exit Sub 'Takes the user back to the form to correct the value 
    End Try 

は、それが周りに戻ってくると、新しい値のユーザー入力を無視して、元の提出と同じ値と同じポイントで失敗します。

"NewFac"の値は、修正された新しい値です。私は、デバッグ中に手動でこの行にそれらをチェックしました:「db.t_Facilities.InsertOnSubmit(NewFac)」

は、私は私が何とかdb.t_Facilities.InsertOnSubmit」から誤った値が含まれていなかった「NewFac」を削除する必要があると仮定します(NewFac)」と言っていますが、これを行う方法はありません。

はFYI:私はここからこのアプローチの主なを得た:https://msdn.microsoft.com/en-us/library/bb763516

任意の助けをいただければ幸いです。

答えて

1

今すぐこれはおそらく技術的に正しいとは思われません、誰かに知らせる;実際にそれ以外の事実に基づいているわけではありませんが、それはうまくいきました。しかし、それはうまくいきました):

いくつかの質問を読んでいるうちに、この解決策が私にもたらされました同じ問題を抱えている他のさまざまな人々(すべてが、プログラムでMatchingを探してDataContextをループするさまざまな方法を使用している)から、データベースのオフラインCLRのように効果的に動作するように見えるDataContextが追加されただけなので、InsertOnSubmitそれは、DeleteOnSubmitがそれを正しく削除する理由がありますか?

だからこのことを念頭に置いて、私はこれを試してみました:

db.t_Facilities.InsertOnSubmit(NewFac) 
Try 
    db.SubmitChanges() 
Catch e As Exception 
    Console.WriteLine(e) 
    MessageBox.Show(e.Message & ". Please correct the field and try again", "ERROR", MessageBoxButton.OK, MessageBoxImage.Stop) 

    db.t_Facilities.DeleteOnSubmit(NewFac) 

    Exit Sub 'Takes the user back to the form to correct the value 
End Try 

それは働きました! :D

だから私はなぜそれが働いたのか(なぜ私は本当に知りたいのですか?私に知らせてください)、それはうまくいきました。

EDIT: 誰かがそれが働いた正しい理由を与えることができれば、私は代わりに私自身の

+0

の自分の答えを受け入れるだろう。これは動作しますが、それは仕事の異なる単位のためのdatacontextsを再利用しないためのより良いデザインです。何かをきれいにすることを忘れてしまった場合、バグを診断するのは難しいことです。また、ロードされたすべてのエンティティがメモリに保持されるため、メモリリークが発生します。 UOWごとに1つのコンテキストを作成するアーキテクチャを採用する。 – usr

+0

私はあなたのコメントの最後の部分を理解していないので、UOWが何を意味するのか分かりませんか? 私はWindowごとにDataContextを持っていて、WindowのすべてのフィールドはDataContextにバインドされています。私はかなりWPFとLINQに新しいので、私は棒の間違った端をつかんで、それを実行するかもしれませんが、私は、DataContextは、ウィンドウが開いているときに存在する必要があるので、 –

+0

作業ユニット= UOW。はい、ウィンドウあたりのコンテキストは良くありません。エンティティへのデータバインディングもそれほど推奨されません。マイクロソフトのチュートリアルでは、単純化とワウ効果のためにユーザーをその方向に導いていますが、実際のアプリケーションには適していません。 – usr

関連する問題