实体框架代码第一次交易

时间:2012-09-21 06:21:13

标签: c# entity-framework entity-framework-4

我正在使用带有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。

我该怎么办呢?

2 个答案:

答案 0 :(得分:2)

  

我该怎么做呢

我认为,你误解了DbContext的概念。它是实体+更改跟踪器的本地缓存。无论您使用实体做什么,这些更改都只是由上下文跟踪而不会影响基础数据源。

这一切都发生在你调用SaveChanges方法之前。此方法以事务方式将更改跟踪器的更改应用于数据源,因此,您所做的所有更改都将保持一致。

如果您以某种方式撰写deleteRowsaddRows,他们就不会致电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()