Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架代码第一个事务_C#_Entity Framework_Entity Framework 4 - Fatal编程技术网

C# 实体框架代码第一个事务

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

我正在使用实体框架4和SQLServerCE作为数据库

因为SQLServerCE不支持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

我该怎么做呢

我该怎么做呢

我认为,您误解了
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:我希望您的更改是事务性的,您必须为两个函数使用相同的上下文实例。此外,上下文没有连接。@KevFixx
ObjectContext
有,但是DbContext没有
BeginTransaction
-我正在查看一个自定义扩展方法:(
context.Connection.BeginTransaction()