[.net] 实体框架6设置连接字符串运行时


Answers

您可以在设计时使用配置文件中的连接字符串工作。

<add name="DWContext" connectionString="metadata=res://*/Database.DWH.DWModel.csdl|res://*/Database.DWH.DWModel.ssdl|res://*/Database.DWH.DWModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=SQLSERVER_INSTANCE;initial catalog=DB_NAME;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

所以不要删除它,因为只有在设计时才需要它。

在运行时用一种动态的方式工作(类似于你的最后一个):

扩展数据上下文部分类:

public partial class DWContext
{
    public DWContext(string nameOrConnectionString)
        : base(nameOrConnectionString)
    {
    }

    /// <summary>
    /// Create a new EF6 dynamic data context using the specified provider connection string.
    /// </summary>
    /// <param name="providerConnectionString">Provider connection string to use. Usually a standart ADO.NET connection string.</param>
    /// <returns></returns>
    public static DWContext Create(string providerConnectionString)
    {
        var entityBuilder = new EntityConnectionStringBuilder();

        // use your ADO.NET connection string
        entityBuilder.ProviderConnectionString = providerConnectionString;

        entityBuilder.Provider = "System.Data.SqlClient";

        // Set the Metadata location.
        entityBuilder.Metadata = @"res://*/Database.DWH.DWModel.csdl|res://*/Database.DWH.DWModel.ssdl|res://*/Database.DWH.DWModel.msl";

        return new DWContext(entityBuilder.ConnectionString);
    }

}

并从您的代码创建一个新的EF数据上下文:

private DWContext db = DWContext.Create(providerConnectionString);

再见 ;-)

Question

我们处于一个混合的环境,我们的应用程序正在使用ADO.NET和实体框架。
由于两者都指向相同的物理SQL服务器,因此我们希望从配置文件中删除实体框架连接字符串,然后根据当前的ADO.NET连接字符串自动生成字符串。
这样可以避免我们在开发人员更改ADO.NET字符串时忘记更改实体框架连接字符串的错误。

我读过这个,但是他们没有回答这个问题。
如何在Entity Framework 6中以编程方式创建连接字符串到MS SQL?

如果我创建自己的DbConnection并将其传递给DbContext(existingConnection,contextOwnsConnection),则会引发一个错误“上下文正在代码优先模式下使用,该代码是从数据库优先或模型优先开发的EDMX文件生成的代码。 “

我没有使用Code First。

https://msdn.microsoft.com/en-us/data/jj680699
这里介绍了EF 6中的代码库配置,但文章并没有显示任何实际改变连接字符串的代码。

更新:更多的信息,以帮助澄清我的问题。
我不是先使用代码,并希望在配置文件之外建立一个连接字符串。
我正在使用的DbContext是T4模板正在生成的自动生成的DbContext文件的部分类。
我的印象是,我需要创建一个继承的DbConfiguration类,并在该类中做一些事情,但我发现唯一的例子是使用Azure。
https://msdn.microsoft.com/en-us/data/jj680699
在Code Project中有一篇关于在运行时设置连接字符串的文章,但文章是基于每次创建一个新的Entity容器时创建一个连接字符串。
http://www.codeproject.com/Tips/234677/Set-the-connection-string-for-Entity-Framework-at

我想能够使用我的部分DbContext类创建连接字符串,以便调用者不必做任何特殊的事情。

更新:运行时代码的工作代码,但不是DesignTime
使用@Circular Reference“下面列出的”发布的代码,我能够改变连接字符串而不改变对我的实体类的调用,但是这对于DesignTime EDMX文件不起作用。

public partial class TestEntities : DbContext
{
    public TestEntities() : base(GetSqlConnection(), true)
    {
    }

    public static DbConnection GetSqlConnection()
    {
        // Initialize the EntityConnectionStringBuilder. 
        EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();

        var connectionSettings = ConfigurationManager.ConnectionStrings("Current_ADO_Connection_In_Config");

        // Set the provider name. 
        entityBuilder.Provider = connectionSettings.ProviderName;

        // Set the provider-specific connection string. 
        entityBuilder.ProviderConnectionString = connectionSettings.ConnectionString;

        // Set the Metadata location. 
        entityBuilder.Metadata = "res://*/Models.TestModel.csdl|res://*/Models.TestModel.ssdl|res://*/Models.TestModel.msl";

        return new EntityConnection(entityBuilder.ToString());
    }
}

现在,如果我能够使DesignTime工作,那么这将是一件好事。