Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 用户没有更改数据库的权限_Sql Server 2008_Asp.net Mvc 4_Ef Code First_Database Permissions - Fatal编程技术网

Sql server 2008 用户没有更改数据库的权限

Sql server 2008 用户没有更改数据库的权限,sql-server-2008,asp.net-mvc-4,ef-code-first,database-permissions,Sql Server 2008,Asp.net Mvc 4,Ef Code First,Database Permissions,我使用的是MVC4、实体框架5和代码优先的方法 当我对模型进行更改并运行应用程序时,会出现一个错误,即由于数据库正在使用,因此无法删除该数据库 为了解决这个问题,我已经实现了自己的IDatabaseInitializer,以强制执行如下单个连接: public class ForceDropCreateDatabaseInitializer<T> : IDatabaseInitializer<T> where T : DbContext, new() { publ

我使用的是MVC4、实体框架5和代码优先的方法

当我对模型进行更改并运行应用程序时,会出现一个错误,即由于数据库正在使用,因此无法删除该数据库

为了解决这个问题,我已经实现了自己的
IDatabaseInitializer
,以强制执行如下单个连接:

public class ForceDropCreateDatabaseInitializer<T> : IDatabaseInitializer<T> where T : DbContext, new()
{
    public ForceDropCreateDatabaseInitializer(Action<T> seed = null)
    {
        Seed = seed ?? delegate { };
    }

    public Action<T> Seed { get; set; }

    public void InitializeDatabase(T context)
    {
        if (context.Database.Exists())
        {
            string databaseName = context.Database.Connection.Database;
            string alterStatement = "ALTER DATABASE [{0}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE";
            string dropStatement = "USE [master] DROP DATABASE [{0}]";

            context.Database.ExecuteSqlCommand(alterStatement, databaseName);
            context.Database.ExecuteSqlCommand(dropStatement, databaseName);
        }

        context.Database.Create();

        Seed(context);
    }
}
公共类ForceDropCreateDatabaseInitializer:IDatabaseInitializer,其中T:DbContext,new()
{
public ForceDropCreateDatabaseInitializer(操作种子=null)
{
种子=种子??委托{};
}
公共操作种子{get;set;}
公共无效初始化数据库(T上下文)
{
if(context.Database.Exists())
{
字符串databaseName=context.Database.Connection.Database;
string alterStatement=“ALTER DATABASE[{0}]设置具有立即回滚功能的单用户”;
string dropStatement=“使用[master]删除数据库[{0}]”;
context.Database.ExecuteSqlCommand(alterStatement,databaseName);
context.Database.ExecuteSqlCommand(dropStatement,databaseName);
}
context.Database.Create();
种子(上下文);
}
}
但现在我在这一行上遇到权限错误:

context.Database.ExecuteSqlCommand(alterStatement,databaseName)

异常消息:

用户没有更改数据库“@p0”的权限,该数据库不存在,或者该数据库未处于允许访问检查的状态

ALTER DATABASE语句失败


我假设使用了@p0,因为我使用的是参数。如何避免此错误,并在每次更改模型时成功删除和创建数据库?

我试图在此处使用您的问题来解决删除正在使用的数据库的问题。不幸的是,我遇到了下面讨论的另一个问题:

似乎不想解析为数据库名称,并不断向我提供错误:

对象或列名丢失或为空。选择进入 语句,验证每列是否有名称。对于其他语句,请参见 用于空别名。不允许使用定义为“”或[]的别名。 添加名称或单个空格作为别名

因此,我刚刚修复了上下文类中的数据库名称:

public class MyContext : DbContext
{
    public MyContext()
        base: ("databasename")
    {}
}
context.Database.Connection.Database
public class MyContext : DbContext
{
    public MyContext()
        base: ("databasename")
    {}
}