我正在使用带有SqlServer CE的Entity Framework 4作为数据库。
因为SqlServer CE不支持TransactionScope,所以我不得不求助于使用BeginTransaction和RollbackTransaction方法。
我有两个GRUD函数来删除和创建数据库中的行。
我想要实现的是这样的:
using (var context = new MyContext())
{
using (var tx = context.BeginTransaction())
{
// grud functions
deleteRows();
addRows();
// do db stuff here...
tx.Commit();
}
}
但我在上下文中找不到BeginTransaction。
我该怎么办呢?
答案 0 :(得分:2)
我该怎么做呢
我认为,你误解了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) {}
答案 1 :(得分:0)
在ObjectContext中,BeginTransaction()
是Connection上的方法,而不是ObjectContext
上的方法
但是, DbContext
直接将BeginTransaction
公开给底层连接。所以你可能没有使用DbContext?
尝试
context.Connection.BeginTransaction()