多语句事务中不允许CREATE DATABASE语句。使用存储过程+ EF创建动态数据库

时间:2017-04-21 12:22:23

标签: c# sql-server entity-framework

我正在尝试使用存储过程创建数据库,如下所示:

CREATE PROCEDURE [dbo].[usp_CreateDatabase]
    @dbName nvarchar(50)
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @createDbQuery nvarchar(max) = 'CREATE DATABASE '+ Quotename(@dbName);
    EXEC (@createDbQuery)
END

此存储过程将位于Master数据库中。

当我在Management Studio中执行此操作时,它按预期工作并创建数据库。

C#代码:

using (Data.MasterDB db = new Data.MasterDB())
{
     db.usp_CreateDatabase(databaseName);
}

dbContext具有Master数据库的连接字符串。

但是当我尝试使用Entity Framework从我的应用程序执行相同操作时,它会抛出

  

多语句事务中不允许CREATE DATABASE语句   数据库'TestDb'不存在。确保正确输入名称

1 个答案:

答案 0 :(得分:0)

您的应用程序在执行程序之前是否创建了一个Transaction? 如果是这样,那将导致此问题,因为过程也在创建事务。

如果您要使用"自动提交"执行管理工作室(或任何IDE)中的过程,您将看到相同的行为。关闭,或者如果你把它包装在这样的交易中:

BEGIN TRANSACTION
    EXECUTE dbo.usp_CreateDatabase TmpData
COMMIT;