0

MVC 4, Entity Framework 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); 
    } 
} 

을하지만 지금은이 라인에 권한 오류가 점점 오전 :

context.Database.ExecuteSqlCommand(alterStatement, databaseName);

예외 메시지 :

User does not have permission to alter database '@p0', the database does not exist, or the database is not in a state that allows access checks.

ALTER DATABASE statement failed.

매개 변수를 사용하기 때문에 @ p0이 사용됩니다. 모델을 변경할 때마다이 오류를 피하고 데이터베이스를 성공적으로 삭제하고 만들 수있는 방법은 무엇입니까?

답변

1

여기에서 내 질문을 사용하여 데이터베이스 사용 중단 문제를 해결하려고했습니다. 불행히도 아래에 설명 된 다른 문제가 발생했습니다. Here is the code I used that might fix the issue for you by completing it slightly differently :이 코드를 사용할 때 내가 가진

// Somewhere in Global.asax 
Database.SetInitializer(new DbInitializer()); 

// DbInitializer  
public class DbInitializer : IDatabaseInitializer<Context> 
{ 
    public void InitializeDatabase(Context context) 
    { 
     if (context.Database.Exists()) 
     { 
      //if (!context.Database.CompatibleWithModel(true)) 
      //{ 
       string singleUserModeCommand = 
       string.Format("ALTER DATABASE [{0}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE", 
          "databasename" /*context.Database.Connection.Database does not seem to work here so i have "fixed" the database name rather than letting it be dynamic*/); 
       if (context.Database.Exists()) 
       { 
        context.Database.ExecuteSqlCommand(singleUserModeCommand); 
        context.Database.Delete(); 
       } 
       context.Database.Create(); 
       Seed(context); 
      //} 

     } 
     else 
     { 
      context.Database.Create(); 
      Seed(context); 
     } 
    } 

    protected void Seed(Context context) 
    { 

    } 
} 

가장 큰 문제였습니다

context.Database.Connection.Database 

데이터베이스 이름으로 분석 할 것 같지 않았고, 나에게 오류주고 보관 :

An object or column name is missing or empty. For SELECT INTO statements, verify each column has a name. For other statements, look for empty alias names. Aliases defined as "" or [] are not allowed. Add a name or single space as the alias name.

그래서 Context 클래스에서 데이터베이스 이름을 수정했습니다.

public class MyContext : DbContext 
{ 
    public MyContext() 
     base: ("databasename") 
    {} 
}