0

我使用 Entity Framework 4 和 SqlServer CE 作为数据库。

因为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。

我该怎么办?

4

2 回答 2

2

我该怎么做

我认为,您误解了DbContext. 它是实体的本地缓存 + 更改跟踪器。无论您对实体做什么,这些更改都只会通过上下文进行跟踪,而不会影响底层数据源。

这一切都会发生,直到您调用SaveChanges方法。此方法以事务方式将更改跟踪器中的更改应用到数据源,因此,您所做的所有更改都是一致的。

如果您以某种方式编写您的deleteRowsand addRows,他们不会调用SaveChanges,并将SaveChangescall 放在这些方法之外的某个地方,您将获得所需的事务:

using (var context = new MyContext())
{
    // grud functions
    deleteRows(context);
    addRows(context);

    context.SaveChanges();
}

private void deleteRows(MyContext context) {}
private void addRows(MyContext context) {}
于 2012-09-21T06:35:11.127 回答
0

在 ObjectContext 中,BeginTransaction()是 Connection 上的方法,而不是ObjectContext 但是,直接DbContext暴露BeginTransaction于底层连接。那么您可能没有使用 DbContext 吗?

尝试

context.Connection.BeginTransaction()
于 2012-09-21T06:39:31.350 回答