2012-09-11 65 views
0

右...使用事務與ExecuteMethodCall

我通過我的傑出的前任,這似乎有LINQ的最初是自動生成的使用功能,其中部分有一個項目,留給我的。不幸的是,他並沒有真正學習如何正確使用和配置LINQ,而是似乎已經將所有自動生成的文件重命名並在任何他認爲合適的地方進行修改。

我沒有提到這是爲了(特別是)抱怨,而是爲了提供上下文,例如,如果建議在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屬性尚未初始化。

在這裏,爲了給它分配一個事務,允許我回滾這些操作,我能得到什麼?

回答

1

您可以使用TransactionScopes控制事務,而無需直接掛接到LINQ的sqlConnection可言。 (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