c# - EntityFramework 6 基于代码的数据库优先连接字符串配置

标签 c# .net entity-framework entity-framework-6

我正在尝试使现有应用程序在没有 app.config 的情况下工作(由于非常特定的环境,需要它)。问题是它严重依赖 EntityFramework 6 来与 SQL-Server 配合使用。

我正在尝试使用 code-based configuration ,但我不知道如何通过我的配置类提供正确的连接字符串。

我做了一个配置类:

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

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

[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。为什么?我错过了什么?

最佳答案

您应该通过 :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();
    }
}

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

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

现在应该可以正常工作了。 (source)

关于c# - EntityFramework 6 基于代码的数据库优先连接字符串配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38636508/

相关文章:

c# - 在使用 XAMLC 时,在 FontSize 中使用静态标记扩展会导致无效转换

c# - Entity Framework : How can I use more then one context and stay synchronized?

c# - Linq 中的左修剪

c# - 真实项目依赖注入(inject)的 F# 模拟

c# - 如果我的变量中有 "n+1"数字,如何获取 "n"作为输出?

c# - 此外,使用现有身份验证密码保护作为 Azure WebApp 托管的 ASP.NET Core MVC 网站

c# - WPF 数据网格 : how to replace null values with 'n/a' automatically?

c# - 如何使用 ServiceControllerPermission

c# - 如何让 SourceAFIS 在 Ubuntu 上运行?

c# - 解析器错误 : Could not create type