将实体框架列入SQLTransaction?
问题描述:
我们有很多使用我们自己的数据对象的遗留代码。我们正在慢慢尝试引入EF。我们需要能够将EF加入到我们已经使用System.Data.SqlClient.SQLTransaction开始的事务中。 EF当然使用System.Transaction.Transaction。这可能吗?将实体框架列入SQLTransaction?
使事情更清楚。我们的代码遍布整个地方,执行以下操作:
public sub DeleteEntity()
Dim InTransaction = ado.InTransaction
if not InTransaction then ado.BeginTran
...
<--want to use EF Here
...
if not InTransaction then ado.CommitTran
end sub
DeleteEntity例程并不简单。它有很多逻辑。我想在代码中间使用EF来代替它,所以我需要将它列入活动事务中。由于它的设计方式,我不能仅仅使用事务范围。在很多地方都会调用DeleteEntity,我不想访问每个调用例程的地方。它更需要处理System.Transaction.Transaction和SqlTransaction,然后处理EF本身。
更新:我想:
context.connection.EnlistTransaction(Transaction.Current)
这是行不通的。
答
我可能是错的,但你有没有考虑使用ObjectQuery而不是使用Linq to Entities进行删除操作。以下是我在MSDN上here
交易的促进发现一个DTC当连接 封闭和单一的事务中重新开放,可能会出现。因为实体 框架自动打开和关闭连接,所以应该考虑手动打开和关闭连接以避免 事务促进。有关更多信息,请参阅如何:Manually Open the Connection from the Object Context。
ObjectQuery不起作用。 DeleteEntity只是一个例子。还有其他功能,我们想用EF来做一小块。在这个例子中。删除实体是400行代码。我只是不是从数据库中简单地删除一个实体。 – coding4fun 2011-12-23 17:52:40