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();
}