Entity Framework 7中的显式事务

17

有没有人知道如何在Entity Framework 7中创建显式事务?所有我找到的信息都是关于EF 6版本的。文档也非常不完整,所以有没有人能提供一个例子呢?

我有一个dbContext,必须删除一个实体及其相关对象,然后再次插入它们,但在同一事务中,这样我就始终拥有行的“版本”。


1
你能否在想要使用事务的小代码片段中包含一下?你有一些 dbContext 或者 DbCommand 吗?通常情况下,应该使用 using (context.Database.BeginTransaction()) {.../*do something*/...},但也可以使用 await context.Database.BeginTransactionAsync()。你可以使用 using (var transaction = context.Database.BeginTransaction()) {...} 并显式调用 transaction.Commit() 来提交事务,或者调用 transaction.Rollback() 进行回滚。还有更多奇特的 EnlistTransaction - Oleg
还不算太奇特...但是;-) 那么,字节与EF6中的相同吗?那我错过了什么。我有一个dbContext,我必须删除一个实体及其相关对象,然后再插入它们。 - Vi100
好的,你的代码可以运行,但它与EF6相同。你介意我删除这个问题,还是希望我编辑一下并让你把评论发布为答案? - Vi100
1
我会发表简短的答案。希望能帮助其他人。 - Oleg
1个回答

17

EF7的事务功能只包含在RC1及以上版本中(请参见此声明)。调用.SaveChanges()(或.SaveChangesAsync())应该使用自动事务。然后,我认为在此之前需要将某些实体的项目标记为已删除状态。

可以通过将一些对数据库的操作放入代码块中来显式地启动事务,例如:

using (context.Database.BeginTransaction()) {
    /*do something*/
}

事务将通过在using块的结尾调用.Dispose()来提交。也可以选择使用

using (var transaction = await context.Database.BeginTransactionAsync()) {
    /*do something*/
    /*one can call
       transaction.Rollback() or transaction.Commit()
      explicitly in the code */
}

它通常应该看起来像Entity Framework之前的版本。参见这篇文章作为例子。


这不是RC-1最终版,需要更新的DatabaseFacade版本。 - user764754
@user764754:你验证过这个吗?例如在RC1中包含的测试,它使用BeginTransaction() - Oleg
在RC-1中,它是EntityFramework.Relational中的扩展方法。后来它在EntityFramework.Core中与DatabaseFacade一起使用。我只引用了核心RC-1,所以我没有找到它。 - user764754
@user764754:你是指EF RC1的源代码吗?请看这里这里 - Oleg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接