C# 实体框架代码第一个事务
我正在使用实体框架4和SQLServerCE作为数据库 因为SQLServerCE不支持TransactionScope,所以我不得不求助于使用BeginTransaction和RollbackTransaction方法 我有两个GRUD函数来删除和创建数据库中的行 我想要实现的是这样的目标:C# 实体框架代码第一个事务,c#,entity-framework,entity-framework-4,C#,Entity Framework,Entity Framework 4,我正在使用实体框架4和SQLServerCE作为数据库 因为SQLServerCE不支持TransactionScope,所以我不得不求助于使用BeginTransaction和RollbackTransaction方法 我有两个GRUD函数来删除和创建数据库中的行 我想要实现的是这样的目标: using (var context = new MyContext()) { using (var tx = contex
using (var context = new MyContext())
{
using (var tx = context.BeginTransaction())
{
// grud functions
deleteRows();
addRows();
// do db stuff here...
tx.Commit();
}
}
但我在上下文中找不到BeginTransaction
我该怎么做呢
我该怎么做呢
我认为,您误解了DbContext
的概念。它是实体的本地缓存+更改跟踪器。无论您对实体做什么,这些更改都只是通过上下文跟踪,而不会影响底层数据源
这一切都会发生,直到调用SaveChanges
方法。此方法以事务方式将更改跟踪程序中的更改应用于数据源,因此,您所做的所有更改都是一致的
如果您将deleteRows
和addRows
以一种不会调用SaveChanges
的方式编写,并将SaveChanges
调用放在这些方法之外的某个地方,您将获得所需的事务:
using (var context = new MyContext())
{
// grud functions
deleteRows(context);
addRows(context);
context.SaveChanges();
}
private void deleteRows(MyContext context) {}
private void addRows(MyContext context) {}
在ObjectContext中,
BeginTransaction()
是连接上的方法,而不是ObjectContext
但是,DbContext
直接向底层连接公开BeginTransaction
。那么您可能没有使用DbContext
试一试
是什么阻止您在
deleteRows
和addRows
中使用相同的上下文实例?出于好奇,什么是grud
函数?因此我必须将上下文传递到函数中,因为crud函数有自己的上下文。@KevFixx:我希望您的更改是事务性的,您必须为两个函数使用相同的上下文实例。此外,上下文没有连接。@KevFixxObjectContext
有,但是DbContext没有BeginTransaction
-我正在查看一个自定义扩展方法:(
context.Connection.BeginTransaction()