2013-04-07 2 views
0

WPF 및 Entity Framework CodeFirst로 응용 프로그램을 개발 중입니다.
하나의 요구 사항은 사용자가 새 프로젝트마다 별도의 데이터베이스 파일을 만들 수 있다는 것입니다.
DbContext : 응용 프로그램 설정에 정의 된Entity Framework 코드 우선 : 프로젝트 당 별도의 데이터베이스 만들기

public class TestContext : DbContext, IUnitOfWork 
{ 
    public TestContext() 
     : base("TestContext") 
    { 
    } 

    #region Implementation of IUnitOfWork 

    public new IDbSet<TEntity> Set<TEntity>() where TEntity : class 
    { 
     return base.Set<TEntity>(); 
    } 

    #endregion Implementation of IUnitOfWork 

    public DbSet<Destination> Destinations { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Configurations.Add(new DestinationMap()); 
    } 

연결 문자열 :

<connectionStrings> 
    <clear /> 
    <add name="TestContext" providerName="System.Data.SqlClient" connectionString="Server=.\sqlexpress;Database=databaseName;Integrated Security=True;Connect Timeout=300;MultipleActiveResultSets=true;" /> 
</connectionStrings> 


I 요청 패턴에 따라 상황을 구현하는 IUnitOfWork 인터페이스에서 DbContext를 주입 StructureMap를 사용했습니다. 이 StructureMap 설정입니다 :

ObjectFactory.Initialize(x => x.Scan(scanner => 
{          
    x.For<IUnitOfWork>().CacheBy(InstanceScope.Hybrid).Use<SpitfireContext>(); 
})); 

사용자가 나는 새로운 프로젝트에 대한 데이터베이스를 만들고 연결 문자열과 힘 응용 프로그램을 변경하려고 새 프로젝트를 만듭니다.

public static void ChangeDatabase(Guid guid) 
{ 
    var sqlConnectionStringBuilder = 
     new SqlConnectionStringBuilder(ConfigHelper.ActiveConnection); 
    sqlConnectionStringBuilder["Database"] = guid.ToString(); 
    ConfigHelper.ActiveConnection = sqlConnectionStringBuilder.ToString(); 
    Database.DefaultConnectionFactory = 
     new System.Data.Entity.Infrastructure.SqlConnectionFactory(ConfigHelper.ActiveConnectionString()); 

    Database.SetInitializer(
     new MigrateDatabaseToLatestVersion<TestContext, MigrationConfiguration>()); 
    using (var context = new TestContext()) 
    { 
     context.Database.Initialize(true); 
    } 
} 

응용 프로그램은 첫 번째 프로젝트에 대한 데이터베이스를 만들고 그 후에 미리보기 데이터베이스를 마이그레이션하려고합니다.
DbConext 개체를 직접 내 코드에 만들지 않아도 해당 연결 문자열을 해당 생성자에 전달할 수 없습니다.
내 문제에 대해 무엇을 제안합니까?
내 코드에 어떤 문제가 있습니까?

답변

0

DbContext 클래스에 데이터베이스 (초기 카탈로그)의 이름을 저장 한 다음 연결 문자열을 변경하여 string.Format과 함께 데이터베이스 이름을 삽입하도록 정적 속성을 추가 하시겠습니까?

그러면 다음에 컨텍스트가 만들어 질 때마다 언제든지 새 대상을 가리킬 수 있습니다.

1

이것은 연결 문자열을 변경하는 까다로운 부분입니다. 그것은 일종의 일이지만 문제가 있습니다.

We had a lengthy discussion on that yesterday. 유사한 (비슷한) 접근 방식에 기반한 코드의 문제에 대한 배경을 설명하는이 관련 게시물을 살펴보십시오.

내가 필요한 경우 추가로 도움이 싶습니다 -하지만 좀 더 많은 정보를 필요 했어 ...

I don't create DbConext object directly in my codes so I can't pass connection string to its constructor 말합니까? TestContext이 있습니다. 통과하지 않으려 고합니다.

또한 DefaultConnectionFactory을 설정하는 것에 대해 잘 모르겠습니다. 다시 확인하겠습니다. 설정할 수는 있지만 앱 시작시에만 권장됩니다 (확실하지는 않음). 그 사이에이 링크를 찾아보십시오 (코드는 비슷하지만 코드는 비슷하다고 생각합니다.) - http://msdn.microsoft.com/en-US/data/jj680699

그런 경우 DbContext 팩토리를 사용하는 것이 유익하다는 결론에 도달했습니다.

관련 문제