2017-12-29 12 views
1

WPF 응용 프로그램이 있습니다. 데이터베이스에 액세스하는 블록이 여러 개 있습니다. 연결 문자열은 내 App.config 파일의 설정에 의해 결정됩니다.런타임에 코드를 통해 전환 가능한 연결 문자열

using (var dbContext = new MyEntities()) 
{ 
    // ... 
} 

하지만 지금은 런타임에 다른 데이터베이스간에 전환 할 수있는 기능이 필요합니다. 각 데이터베이스에 대한 연결 문자열과 함께 데이터베이스 목록을 관리하는 코드를 업데이트했습니다.

제 질문은 기존 코드를 변경하지 않고도 내 코드에 표시된 연결 문자열을 사용하여 기존 코드를 유지할 수있는 방법이 있습니까? 예를 들어, 엔터티 클래스에서 정적 연결 문자열 속성을 만든 다음 해당 클래스를 수정하여 데이터베이스에 연결할 때마다 해당 속성을 사용할 수 있습니다.

누구에게이 작업을 수행 했습니까? 통증이없는 방법으로 이것을 할 수있는 조언이 있습니까?

+1

스위치를 사용하면 시작시 또는 응용 프로그램 수명 동안 한 번만 전환 할 수 있습니까? – Evk

+0

@Evk : * 응용 프로그램이 실행되는 동안 * 실행 시간 *으로 표시됩니다. 응용 프로그램 인스턴스 중에 여러 번 발생할 수 있습니다. –

+0

동일한 연결 문자열을 사용하는 모든 컨텍스트 인스턴스가 필요합니까? – Evk

답변

0

내가 생각한 가장 좋은 아이디어는 내 개체 클래스에 정적 ConnectionString 속성을 추가하는 것이 었습니다. 그런 다음이 속성을 기본 클래스에 전달하도록 생성자를 수정합니다.

하나의 문제는 모델이 업데이트 될 때 엔티티 클래스에 대한 모든 변경 사항이 T4 스크립트에 의해 덮어 쓰여질 수 있다는 것입니다. 부분 클래스를 만들고 고유 한 생성자를 정의 할 수 있지만 해당 생성자에 인수가 없으면 기존 생성자와 충돌합니다.

내 솔루션은 실제로 아래와 같이 직접 기존 T4 스크립트를 편집하는 것이 었습니다.

<#=Accessibility.ForType(container)#> partial class <#=code.Escape(container)#> : DbContext 
{ 
    // Original code 
    //public <#=code.Escape(container)#>() 
    // : base("name=<#=container.Name#>") 
    //{ 

    // Modified code 
    public static string ConnectionString { get; set; } 

    public <#=code.Escape(container)#>() 
     : base(ConnectionString) 
    { 

    // End of modified code 

<# 
if (!loader.IsLazyLoadingEnabled(container)) 
{ 
#> 
     this.Configuration.LazyLoadingEnabled = false; 
<# 
} 

T4 스크립트를 저장하면 코드가 즉시 재생성됩니다.

+0

T4 스크립트는 런타임에 어떻게 실제적으로 연결 문자열을 변경합니까? 다른 프로세스 또는 서비스에 의해 생성되고 있습니까? – ryanwebjackson

+0

@ryanwebjackson : 기본 생성자는 연결 문자열을 구성 파일에서 읽어야 함을 나타내는 문자열을 전달합니다. 내 변경 내용을 정적 정적'ConnectionString' 속성을 전달합니다. 내 질문의 핵심은 코드에서이 연결 문자열을 변경할 수 있기를 원했고 이제는 해당 속성의 값을 설정하여 할 수 있습니다. 그런 다음 DbContext의 인스턴스를 만들면 해당 값이 사용됩니다. –

+0

오, 알겠습니다 - 당신의 필요에 맞게 수정 한 기존 코드입니다. – ryanwebjackson

관련 문제