2016-07-28 8 views
1

既存のアプリケーションをapp.configなしで作成しようとしています(非常に特定の環境のために必要です)。問題は、EntityFramework 6がSQL Serverと連携することに大きく依存していることです。EntityFramework 6データベースベースの接続文字列のコードベースの設定

私はcode-based configurationを利用しようとしていますが、私の設定で正しい接続文字列を提供する方法はわかりません。

私は、設定クラスを作りました。そして、

public class MyConfiguration : DbConfiguration 
{ 
    public MyConfiguration() 
    { 
     SetDefaultConnectionFactory(new MyConnectionFactory()); 
     SetProviderServices("System.Data.SqlClient", System.Data.Entity.SqlServer.SqlProviderServices.Instance); 
    } 
} 

私DbContext(BDからautomaticaly EFによって生成される)にそれを提供する:

:カスタム接続ファクトリで

[DbConfigurationType(typeof(MyConfiguration))] 
public partial class TestModelEntities 
{   
} 

public class MyConnectionFactory : IDbConnectionFactory 
{ 
    public DbConnection CreateConnection(string nameOrConnectionString) 
    { 
     var newConnStringBuilder = new SqlConnectionStringBuilder 
     { 
      UserID = "user", 
      Password = "pass", 
      InitialCatalog = "databaseName", 
      DataSource = "serverName" 
     }; 

     var entityConnectionBuilder = new EntityConnectionStringBuilder 
     { 
      Provider = "System.Data.SqlClient", 
      ProviderConnectionString = newConnStringBuilder.ToString(), 
      Metadata = @"res://*/TestModel.csdl| 
          res://*/TestModel.ssdl| 
          res://*/TestModel.msl" 
     }; 

     var newDbConnect = new EntityConnection(entityConnectionBuilder.ToString()); 
     return newDbConnect; 
    } 
} 

ただし、私がそれをテストしようとしているとき、私はまだUnintentionalCodeFirstExceptionを得ています。どうして?私は何が欠けていますか?

答えて

3

コンテキストに接続文字列を:base(connectionString)で指定する必要があります。以下のようにクラスを作成します。

public class ConnectionStringBuilder 
{ 
    public static string Construct() 
    { 
     var newConnStringBuilder = new SqlConnectionStringBuilder 
     { 
      UserID = "user", 
      Password = "pass", 
      InitialCatalog = "databaseName", 
      DataSource = "serverName" 
     }; 

     var entityConnectionBuilder = new EntityConnectionStringBuilder 
     { 
      Provider = "System.Data.SqlClient", 
      ProviderConnectionString = newConnStringBuilder.ToString(), 
      Metadata = @"res://*/TestModel.csdl| 
          res://*/TestModel.ssdl| 
          res://*/TestModel.msl" 
     }; 

     return entityConnectionBuilder.ToString(); 
    } 
} 

次に、このように見えるように、あなたのコンテキストコンストラクタを変更します。

public DbContext() 
    : base(ConnectionStringBuilder.Construct()) 
{ 
} 

それは今、正常に動作する必要があります。 (source

+0

Heh。驚くほど簡単な解決策。ありがとう! – user3223738

関連する問題