在Entity Framework 6中,执行存储过程是否需要调用SaveChanges?

6

我有一个关于在Entity Framework中调用存储过程的问题。这是我的代码:

using (var context = new DbContext("test"))
{
    context.Database.ExecuteSqlCommand("SomeStoredProcedure");
    context.SaveChanges();
}

我需要直接调用SaveChanges方法(就像在这个例子中一样),还是这个事务会自动提交?

你试过了吗?不要使用 SaveChanges() 执行它,看看是否会持久化。 - Matt Rowland
这个问题非常类似于https://dev59.com/slzUa4cB1Zd3GeqPzx3s - Bearcat9425
我已经尝试过并且这个事务已经提交了,我的问题是:是否有任何解决方案可以防止存储过程提交,除非我直接调用SaveChanges方法? - Mateusz277
如果您有新的问题,您需要打开一个新的问题。 - Matt Rowland
这个存储过程是做什么的?我有一种感觉,EF 在这种情况下并没有真正被使用(也许应该切换到 Dapper?)或者这个存储过程可以被数据库触发器替代。 - Spivonious
3个回答

5

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

4

2
从EF6开始,Database.ExecuteSqlCommand()默认情况下会在命令周围包装一个事务(如果没有已经存在的事务)。如果您希望覆盖此行为,则可以使用此方法的重载。此外,在EF6中,通过诸如ObjectContext.ExecuteFunction()之类的API包含在模型中的存储过程执行相同的操作(除了目前无法覆盖默认行为)。 https://msdn.microsoft.com/en-us/library/dn456843(v=vs.113).aspx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接