2012-08-24 3 views
3

그래서이 작업은 정말 간단하다고 생각합니다. 그러나 어떤 이유로 응답을 찾을 수 없습니다. 내 문제는 전에 ObjectContext에서 상속받은 EF 4.3.1 컨텍스트를 사용하고 자동 생성이 항상 연결 문자열을 매개 변수로 허용하는 오버로드 된 생성자를 만들었다는 점입니다.EF 5.0 모델에 연결 문자열 제공

이제 EF 5.0으로 전환하려고 했으므로 DbContext 버전을 사용해야합니다. 그러나 DbContext에서 상속 된 MyEntities에는 사용할 수있는 매개 변수가없는 생성자 만 있습니다. 오버로드 된 생성자를 직접 추가하고 기본 (connectionString)을 호출하도록 만들었지 만 자동 생성 된 파일을 수동으로 변경하는 것은 위험한 비즈니스처럼 보일뿐입니다.

그래서 런타임에 제공하는 연결 문자열을 사용하는 MyEntities 인스턴스를 어떻게 만듭니 까?

+0

적어도에서, 클래스 스키마를 리버스 엔지니어링 'EDMX'감각. 디자이너에게 변경 사항이있을 때 모든 수업을 다시 만들었습니다. 이제는 한 번 생성됩니다. 이론적으로 매핑과 컨텍스트 코드는 모두 손으로 작성할 수 있으므로 IMO에서 두 번째 생성자를 자유롭게 추가 할 수 있습니다. 그것은 대답보다 더 많은 의견입니다. 아마도 다른 누군가가 더 좋은 아이디어를 가지고있을 수도 있습니다. :) –

+0

적어도 파일은 MyEntities.Context.cs 아래에 MyEntities.Context.cs로 나타나며 심지어 파일 시작 부분에 파일이 자동 생성되었으며 수동 변경 사항을 덮어 쓸 것이라는 경고 메시지가 표시됩니다. – bobblez

+0

아, 그래서 당신은 T4 세대를 사용하고 있습니다. 그렇다면 T4 템플릿을 사용한 적이 없기 때문에 확실하게 말할 수는 없습니다. 순수한 '코드'버전의 매핑 (Code-First 또는 Database-First가 중요하지 않음)을 사용하고 있다면 수정하지 않을 이유가 없습니다. –

답변

1

연결 팩토리를 사용해 보셨습니까?

이 예제는 SqLite 용이지만 모든 데이터베이스에 적용됩니다.

당신이 유사한 클래스를 만들 수 있습니다

:

public class SqLiteConnectionFactory : IDbConnectionFactory 
{ 
    public System.Data.Common.DbConnection CreateConnection(string nameOrConnectionString) 
    { 
     var databaseDirectory = @"C:\\master.db"; 

     var builder = new SQLiteConnectionStringBuilder 
     { 
      DataSource = databaseDirectory, 
      Version = 3 
     }; 
     return new SQLiteConnection(builder.ToString()); 
     } 
} 

을 당신이 당신의 컨텍스트 처음 액세스하기 전에 다음이 문을 실행하여 경우에 사용합니다 여기

Database.DefaultConnectionFactory = new ConnectionFactories.SqLiteConnectionFactory(); 
0

는 기능입니다 연결 문자열 작성 (여기에서 Firebird 용) :

private static string ConnectionString(string dbFileName) 
    { 
     // Specify the provider name, server and database. 
     const string providerName = "FirebirdSql.Data.FirebirdClient"; 
     const string metaData = "res://*/RcModel.csdl|res://*/RcModel.ssdl|res://*/RcModel.msl"; 

     // Initialize the EntityConnectionStringBuilder. 
     EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder(); 

     //Set the provider name. 
     entityBuilder.Provider = providerName; 

     FbConnectionStringBuilder sqlBuilder = new FbConnectionStringBuilder(); 

     sqlBuilder.UserID = "sysdba"; 
     sqlBuilder.Password = "masterkey"; 
     sqlBuilder.DataSource = @"127.0.0.1"; 
     sqlBuilder.Database = dbFileName; 
     sqlBuilder.Dialect = 3; 
     sqlBuilder.Charset = "UTF8"; 
     sqlBuilder.ServerType = FbServerType.Default; 

     // Set the provider-specific connection string. 
     entityBuilder.ProviderConnectionString = sqlBuilder.ConnectionString; 
     entityBuilder.Metadata = metaData; 
     return entityBuilder.ToString(); 
    } 

다음과 같이 사용하십시오.

 string cs = ConnectionString(@"C:\myDbFile.fbd"); 
     EntityConnection conn = new EntityConnection(cs); 
     MyEntities db = new MyEntities(conn); 
-1

MyEntities를 만들 수있는 곳입니다. 이런 식으로 뭔가 :

MyEntities dataContext = new MyEntities(); 

dataContext.Database.Connection.ConnectionString = "<YOUR CONNECTION STRING>"; 

당신의 edmx이 설정 만들 때 여전히 그렇게 할 것입니다하지만 당신은 그 안에 포함 된 데이터베이스 공급자의 연결 문자열을 제거 할 수있는 연결 문자열을 찾기 위해 설정 인 경우. (SQL에 연결하는 경우)은 다음과 같이 보일 것이라는 점을 수행 한 후 : 당신이하는 EF 전동 공구를 사용하더라도, 그것은 정말 '자동 생성'아니에요

<connectionStrings> 
     <add name="MyEntities" connectionString="metadata=res://*/MyEntities.csdl|res://*/MyEntities.ssdl|res://*/MyEntities.msl;provider=System.Data.SqlClient;provider connection string=;" providerName="System.Data.EntityClient" /> 
</connectionStrings> 
관련 문제