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