2016-07-28 54 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(automaticaly从BD由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