EntityFramework 6基于数据库的连接字符串的基于代码的配置

use*_*738 2 .net c# entity-framework entity-framework-6

我正在尝试在没有app.config的情况下使现有应用程序正常工作(由于环境非常具体,因此需要使用该程序)。问题在于它在很大程度上依赖于EntityFramework 6与SQL Server一起工作。

我正在尝试使用基于代码的配置,但无法弄清楚如何通过配置类提供正确的连接字符串。

我做了一个配置类:

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

然后将其提供给我的DbContext(由EF从bd自动生成):

[DbConfigurationType(typeof(MyConfiguration))]
public partial class TestModelEntities
{           
}
Run Code Online (Sandbox Code Playgroud)

使用自定义连接工厂:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然而。测试时,我得到一个UnintentionalCodeFirstException。为什么?我想念什么?

Adi*_*dov 5

您应该通过: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();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后将您的Context构造函数修改为如下所示:

public DbContext()
    : base(ConnectionStringBuilder.Construct())
{
}
Run Code Online (Sandbox Code Playgroud)

现在应该可以正常工作了。(来源