右...
我有一个项目,由我的杰出前任留给我,其中一部分似乎最初是使用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属性尚未初始化。
在这里,为了给它分配一个事务,我可以得到什么来允许我回滚这些动作?
答案 0 :(得分: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
答案 1 :(得分:0)
您可以从数据上下文中获取更改集,并使用更改集数据还原更改。
http://xacc.wordpress.com/2009/02/17/datacontextrevertchanges/
提供了有关此方法的文章