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# 实体框架6中存储过程的执行是否需要调用SaveChanges?_C#_Entity Framework_Stored Procedures - Fatal编程技术网

C# 实体框架6中存储过程的执行是否需要调用SaveChanges?

C# 实体框架6中存储过程的执行是否需要调用SaveChanges?,c#,entity-framework,stored-procedures,C#,Entity Framework,Stored Procedures,我对在实体框架中调用存储过程有疑问。我有以下代码: using (var context = new DbContext("test")) { context.Database.ExecuteSqlCommand("SomeStoredProcedure"); context.SaveChanges(); } 我需要直接调用方法SaveChanges(如本例中所示),还是该事务将自动提交?调用ExecuteSqlCommand()后不需要使用SaveChanges()命令。 但

我对在实体框架中调用存储过程有疑问。我有以下代码:

using (var context = new DbContext("test"))
{
    context.Database.ExecuteSqlCommand("SomeStoredProcedure");
    context.SaveChanges();
}
我需要直接调用方法
SaveChanges
(如本例中所示),还是该事务将自动提交?

调用
ExecuteSqlCommand()
后不需要使用
SaveChanges()
命令。 但是,请注意,在重新加载实体之前,上下文不会知道在该调用期间发生的更改


SaveChanges
基本上将上下文的更改跟踪器中的更改与数据存储同步。当您通过
context.Database.ExecuteSqlCommand
调用存储过程时,它会完全忽略存储过程可能应用于数据库的任何更改,因此
SaveChanges
不会提交这些更改。它们已经提交(假设存储过程修改数据)

您的根本问题似乎是如何在一个事务中提交所有更改(来自存储过程和SaveChanges)。如果这是您想要的,您可以将代码包装为:


从EF6
数据库开始。默认情况下,ExecuteSqlCommand()
将在事务中包装该命令(如果尚未存在)。此方法的重载允许您根据需要重写此行为。同样,在EF6中,通过API(如
ObjectContext.ExecuteFunction()
)执行模型中包含的存储过程也会执行相同的操作(除了目前无法覆盖默认行为)


你试过了吗?在不使用
SaveChanges()
的情况下执行它,并查看它是否仍然存在。这个问题非常类似于,我已经尝试过,并且该事务已提交,我的问题是:除非我直接调用方法SaveChanges,否则有没有任何解决方案可以防止提交存储过程?如果您有一个新问题,您需要打开一个新问题。这个存储过程做什么?我有一种感觉,EF在这种情况下并没有真正被使用(可能切换到Dapper?),或者这个存储过程可以被数据库触发器所取代。
using (var ts = new System.Transactions.TransactionScope())
{
    using (var context = new DbContext("test"))
    {
        ... // more code here
        context.Database.ExecuteSqlCommand("SomeStoredProcedure");
        context.SaveChanges();
    }
    ts.Complete();
}