我有一个关于在Entity Framework中调用存储过程的问题。这是我的代码:
using (var context = new DbContext("test"))
{
context.Database.ExecuteSqlCommand("SomeStoredProcedure");
context.SaveChanges();
}
我需要直接调用
SaveChanges
方法(就像在这个例子中一样),还是这个事务会自动提交?我有一个关于在Entity Framework中调用存储过程的问题。这是我的代码:
using (var context = new DbContext("test"))
{
context.Database.ExecuteSqlCommand("SomeStoredProcedure");
context.SaveChanges();
}
SaveChanges
方法(就像在这个例子中一样),还是这个事务会自动提交?SaveChanges
的基本作用是将上下文中的更改与数据存储同步。当你通过 context.Database.ExecuteSqlCommand
调用存储过程时,上下文本身对于存储过程可能对数据库应用的任何更改都是毫不知情的,因此 SaveChanges
不会提交其中的任何更改。它们已经被提交了(假设存储过程修改了数据)。
你的实际问题似乎是如何在一个事务中提交所有更改(包括来自存储过程和 SaveChanges 的更改)。如果这是你想要的,你可以在代码中使用 TransactionScope
:
using (var ts = new System.Transactions.TransactionScope())
{
using (var context = new DbContext("test"))
{
... // more code here
context.Database.ExecuteSqlCommand("SomeStoredProcedure");
context.SaveChanges();
}
ts.Complete();
}
ExecuteSqlCommand()
命令执行后不需要使用SaveChanges()
命令。但是请注意,在重新加载实体之前,上下文将不知道在该调用期间发生的更改。详见https://msdn.microsoft.com/en-us/data/jj592907.aspx。Database.ExecuteSqlCommand()
默认情况下会在命令周围包装一个事务(如果没有已经存在的事务)。如果您希望覆盖此行为,则可以使用此方法的重载。此外,在EF6中,通过诸如ObjectContext.ExecuteFunction()
之类的API包含在模型中的存储过程执行相同的操作(除了目前无法覆盖默认行为)。
https://msdn.microsoft.com/en-us/library/dn456843(v=vs.113).aspx
SaveChanges()
执行它,看看是否会持久化。 - Matt Rowland