2012-08-08 1 views
4

직접 작성한 connectionString을 사용하여 (코드 우선) 마이그레이션을 실행하려고합니다.Entity Framework 4.3.1 마이그레이션은 항상 기본 생성자를 호출하고 연결 문자열을 무시합니다.

진입 점은 하나의 매개 변수 인 connectionString이있는 정적 함수입니다.

기본 생성자와 함께 PocModel이라는 DbContext 클래스가 있습니다.

public PocModel() : base("PocModel") 
{ ... 

그리고 문자열 인수와 컨텍스트 생성자 :

public PocModel(string nameOrConnectionString): base(nameOrConnectionString) 
{ ... 

내 목표는 ConnectionString에 의해 대상이되는 데이터베이스 마이그레이션을 수행하는 것이 아니라 ConnectionString을은 EF는 "마술"를 통해 생성하는 이름 만 (localhost \ sqlexpress - PocModel).

이 작업을 수행 할 수 없었습니다.

I는 다음과 같이 선언 된 "외부"기능이 있습니다

public static void MigrateDatabase(string connectionString) 
{ ... 

나는 FLW에 구현하기 위해 노력했다이 기능. 방법 :

DbMigrator migrator = new DbMigrator(new Migrations.Configuration()); 
migrator.Configuration.TargetDatabase = new DbConnectionInfo(connectionString, "System.Data.SqlClient"); 
migrator.Update(); 

그리고이 같은 :.

Database.DefaultConnectionFactory = new SqlConnectionFactory(connectionString); 
Database.SetInitializer<PocModel>(new MigrationInitializer()); 
PocModel model = new PocModel(connectionString); 
model.Dispose(); 

나는 심지어 동적으로

ConfigurationManager.ConnectionString["PocModel"] 
에 전달 된 ConnectionString을하려면

설정하는 것을 시도했다 그러나 슬프 도다, 모든 실패 기본 PocModel 생성자는 EF 마이그레이션 코드 내에서 대상 서버로 호출됩니다. localhost \ sq lexpress 및 데이터베이스 : PocModel.

"localhost \ sqlexpress"에있는 이름이 "PocModel"이 아닌 데이터베이스로 마이그레이션을 수행 할 수 없었습니다.

정적 외부 함수를 통해 전달해야하므로 app.config 파일을 사용하여 connectionString을 설정하는 것은 선택할 수 없습니다.

도와주세요. 아주 오랫동안이 문제에 봉착했습니다.

편집 : 나는이 해킹에 의해 작동했다,하지만 난 정말이 문제에 대한 다른 솔루션합니다 (EF 마이그레이션 일명 결함이)가 없다는 것을

private static string _databaseNameOrConnectionString = "PocModel"; 

     internal static string DatabaseNameOrConnectionString 
     { 
      get { return _databaseNameOrConnectionString; } 
      //HACK: This setter must ONLY be called from SetupModule.MigrateDatabase. It is a hack to circumvent the code-first migrations usage of this ctor. 
      set { _databaseNameOrConnectionString = value; } 
     } 

     //the code first migrations will call this ctor and ignore the connectionString it have been passed. 
     public PocModel() 
      : base(DatabaseNameOrConnectionString) 
     { 

답변

1
을 확인하기 위해 질문을하고

Update-database 호출은 기본 생성자를 사용하므로 해당 함수를 수정해야합니다. 당신은 당신이 정적 클래스를 가지고 있다고 언급했는데 정적 헬퍼없이이 작업을 할 수있는 방법을 찾지 못했습니다.다음

public static class Helper 
    { 
     public static string GetConnectionString() 
     { 
      SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(); 
      builder.DataSource = @".\sqlexpress"; 
      builder.InitialCatalog = "migrateme"; 
      builder.IntegratedSecurity = true; 
      builder.MultipleActiveResultSets = true; 
      return builder.ConnectionString; 
     } 
    } 

하고 대신 기본 생성자를 호출, 나는 사용자 정의 문자열로 생성자를 호출하고 난 당신과 같은 문제를 가지고 올바른 데이터베이스

public PocModel() : base(Helper.GetConnectionString()) 
{ 

} 
+0

예, 제가 구현 한 내용이 다소 있습니다. 그러나 이것은 "더러운 오래된 해킹"이며 기본 생성자를 조작하지 않고 올바른 방법을 찾고 있음을 알았습니다. 이렇게하면 기본이 아닌 생성자를 사용하는 목적을 완전히 무효화합니다 (사용할 수 없음). 어쨌든 답장을 보내 주셔서 감사합니다. 문제가 해결 되더라도 답변으로 표시하지 않겠습니다. –

0

를 만들었습니다. 그러나 당신이 시도했지만 작동하지 않았다는 해결책을 발견했습니다. 다음 코드는 저에게 효과적이었습니다. 나는

var configuration = new TMigrationsConfiguration(); 
configuration.TargetDatabase = new DbConnectionInfo(context.Database.Connection.ConnectionString,"System.Data.SqlClient"); 
var migrator = new DbMigrator(configuration); 
migrator.Update(); 

하지 않는 프레임 워크의이 부분에 버그가있는 것 같습니다 ... 여기 http://romiller.com/2012/02/09/running-scripting-migrations-from-code/ 자신의 연결 문자열이 무시됩니다 것을 발견하는 사람들을 위해

var configuration = new Configuration(); 
configuration.TargetDatabase = new DbConnectionInfo("Server=MyServer;Database=MyDatabase;Trusted_Connection=True;", 
    "System.Data.SqlClient"); 
var migrator = new DbMigrator(configuration); 
migrator.Update(); 
+0

localhost/SqlExpress에서 실행중인 Sql Server 인스턴스가있을 때이 작업을 시도 했습니까? –

0

그것을 발견

var configuration = new TMigrationsConfiguration(); 
var migrator = new DbMigrator(configuration); 
migrator.Configuration.TargetDatabase = new DbConnectionInfo(context.Database.Connection.ConnectionString,"System.Data.SqlClient"); 
migrator.Update(); 

즉, 대상 데이터베이스는 무시됩니다. 마이그레이션 도구를 만든 후에 anged. 이어야 Migrator에 추가하기 전에 TargetDatabase를 설정해야합니다.