在Entity Framework中没有事务的存储过程

7

我在Entity Framework 6中调用一个存储过程,可以在必要时创建数据库和表。但是它会抛出错误信息:

消息 "CREATE DATABASE语句不允许在多语句事务内执行。\r\nALTER DATABASE语句不允许在多语句事务内执行。\r\n数据库“CoreSnapshotJS3”不存在,请确保名称输入正确。" 字符串

我不想在事务中执行它,并使用以下代码来取消事务:

using (var transation = new TransactionScope(TransactionScopeOption.Suppress))
{
    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("spCreateSnapshotFromQueue", snapshotQueueIDParameter);    
}

它仍然会报错。

如何停止自动交易?


1个回答

26

我找到了一种方法:

var snapshotQueueIDParameter = new SqlParameter("SnapshotQueueID", entityId);
return _db.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction,
        "EXEC spCreateSnapshotFromQueue @SnapshotQueueID", snapshotQueueIDParameter);

有没有一种方法可以在不开启事务的情况下运行存储过程并执行 DQL - Select,同时也无需在存储过程中使用任何输出参数来获取结果。 - Rupendra
在 .NET Core 中没有 TransactionalBehavior 类 :/ - Muflix
1
@Muflix 在 EF Core 中,ExecuteSqlInterpolated/ExecuteSqlRaw 不会自动启动事务。https://learn.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.relationaldatabasefacadeextensions.executesqlraw?view=efcore-6.0 - Michael Freidgeim

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