0

右...

私には、輝かしい前任者が残したプロジェクトがあります。その一部は、元々LINQの機能を使用して自動生成されたようです。残念ながら、LINQの適切な使用方法と構成方法を実際に学ぶ代わりに、彼は自動生成されたすべてのファイルの名前を変更し、変更を加えるのに適していると思われる場所でそれらを削除したようです。

私はこれを(具体的には)不平を言うために言及していませんが、たとえば、Designerでコードの一部の側面を構成するようにアドバイスされた場合、このコードのDesignerは削除されているため、存在しないというコンテキストを提供します。

とにかく、私には特定の関数があります。これは元々デザイナーが生成したものであり、次のようになります。

<System.Data.Linq.Mapping.DatabaseAttribute(Name:="ProductionControlMS")> _
Partial Public Class Database
Inherits System.Data.Linq.DataContext

<FunctionAttribute(Name:="dbo.ReleaseItemToProduction")> _
Public Function ReleaseBuildPack(<Parameter(Name:="TransitionID", DbType:="Int")> ByVal TransitionID As Integer, _
                                          <Parameter(Name:="SubLevelID", DbType:="Int")> ByVal SubLevelID As Integer, _
                                          <Parameter(Name:="CompNo", DbType:="TinyInt")> ByVal CompNo As Byte) As Integer
    Dim result As IExecuteResult = Me.ExecuteMethodCall(Me, CType(MethodInfo.GetCurrentMethod, MethodInfo), TransitionID, SubLevelID, CompNo)
    Return CType(result.ReturnValue, Integer)
End Function

ロールバックする必要があるかもしれないので、この関数をトランザクションに割り当てることができる必要があります。残念ながら、電話をかけることはできましProductionControlMS.Connection.BeginTransactionたが、トランザクションを現在のコマンドに割り当てる方法がわかりません。したがって、コードがそのMe.ExecuteMethodCall行に到達すると、InvalidOperationExceptionが発生し、次のメッセージが表示されます。

ExecuteNonQueryでは、コマンドに割り当てられた接続が保留中のローカルトランザクションにある場合、コマンドにトランザクションが必要です。コマンドのTransactionプロパティが初期化されていません。

ここで、トランザクションを割り当てて、これらのアクションをロールバックできるようにするために、何を取得できますか?

4

2 に答える 2

1

LINQ の SQLConnection に直接フックしなくても、 TransactionScopes を使用してトランザクションを制御できます。(LINQ2SQL は自動的に TransactionScope にフックします)

例えば:

Using ts As New TransactionScope()
    new MyDataContext().ReleaseBuildPack(TransitionID, SubLevelID, CompNo )

    ' Do whatever else you need to do here under the same transaction

    ' If successful, then Complete. 
    ' If no Complete() is called before the ts exits scope then the transaction will be rolled back
    ts.Complete()
End Using 
于 2012-09-11T12:01:03.047 に答える
0

データ コンテキストから変更セットを取得し、変更セット データを使用して変更を元に戻すことができます。

このアプローチに関する記事は、 http: //xacc.wordpress.com/2009/02/17/datacontextrevertchanges/で入手できます。

于 2012-09-11T10:27:42.130 に答える