如何在 EF6 中将连接字符串传递给 DataContext

Posted

技术标签:

【中文标题】如何在 EF6 中将连接字符串传递给 DataContext【英文标题】:How to pass connection string to DataContext in EF6 【发布时间】:2021-12-27 03:42:15 【问题描述】:

我有一个 ASP.NET MVC 5 Web 应用程序并有以下代码:

public HAZID_DataContext() : base("HAZIDDEV")

    System.Data.Entity.SqlServer.SqlProviderServices.UseScopeIdentity = false;

我希望能够根据我的工作环境设置来设置HAZIDDEV

例如,在 web 配置中,我们有以下内容

  <connectionStrings>
    <add name="HAZIDTEST" connectionString="Server=DTISQLVS02\DEVELOPMENT;Database=HAZID;Trusted_Connection=True;" providerName="System.Data.SqlClient" />
    <add name="HAZIDDEV" connectionString="Server=DTIDEV27;Database=HAZIDDEV;Trusted_Connection=True;" providerName="System.Data.SqlClient" />
  </connectionStrings>

并希望在 web 配置中有一个像这样的变量

<appSettings>
<add key="webpages:Version" value="3.0.0.0" />
<add key="webpages:Enabled" value="false" />
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusivejavascriptEnabled" value="true" />

<add key="DefaultCulture" value="en" />
<add key="WorkEnvironment" value="Development"/>
<add key="PrefixDefaultCulture" value="false" />
<add key="SupportedCultures" value="en,fr" />
</appSettings>

所以我可以有一个HAZIDDEVHAZIDTESTHAZIDPROD 连接字符串,如果我查看应用程序设置WorkEnvironment 并且它是Development,那么我将使用HAZIDDEV 作为连接。

任何帮助或见解将不胜感激

【问题讨论】:

请解释一下工作环境是什么意思? @Carl Cummings:base("HAZIDDEV") 中的参数是配置文件中连接字符串的名称。因此,您只需要相应地修改每个环境的配置文件即可。 感谢我们现在所做的一切,但希望有一种方法可以让我们的所有连接字符串在配置中并基于另一个标志使用正确的连接字符串。我将问题修改为 biut mopre 以添加更多关于我们所想的代码,但它可能是不可能的 【参考方案1】:

如果您的目标是为不同的环境使用单独的连接字符串,那么您不应该分隔连接字符串变量。而是改变连接字符串的值。

将您的 DBContext 对象配置为如下所示:

public partial class HAZID_DataContext : DbContext

        public HAZID_DataContext()
        
        

        public HAZID_DataContext(DbContextOptions<HAZID_DataContext> options)
            : base(options)
        
        

        //Other codes goes here


然后在app启动时注入连接字符串:

public void ConfigureServices(IServiceCollection services)

    services.AddDbContext<HAZID_DataContext>(opts =>
 opts.UseSqlServer(Configuration.GetConnectionString("HAZIDDEV")));
    
    ...

然后在 MVC Core 的 appsettings.json 文件中:


  "ConnectionStrings": 
    "HAZIDDEV": "Data Source=.\SQLEXPRESS2012;Initial Catalog=dbname;Persist Security Info=True;User ID=abc;Password=abc"
  

或以这种方式从 web.config 或其他配置文件中读取:

ConfigurationManager.ConnectionStrings["HAZIDDEV"].ConnectionString;

只需根据环境更改连接字符串的值即可。或者根据需要有多个连接字符串。

【讨论】:

感谢您的信赖,但我使用的是 EntityFramework 而不是 EntityFrameworkCore。 这个想法是向您展示如何在不同的环境中拥有不同的连接字符串。除了连接字符串部分之外,上面的代码将是相同的。您正在从 Web 配置或其他配置文件中读取连接字符串,对吗?只需更换连接字符串读取源部分。然后你仍然可以有多个连接字符串并根据环境读取一个。 啊,我明白了。我的问题是我试图实现这一点,但找不到要使用的库。不过谢谢,因为这让我做了更多的学习和深入研究这一切是如何运作的。 @CarlCummings 我已经更新了答案。检查示例代码。

以上是关于如何在 EF6 中将连接字符串传递给 DataContext的主要内容,如果未能解决你的问题,请参考以下文章

如何在plsql中将字符串数据类型传递给数字数据类型

如何在 mongodb 聚合中将动态字符串传递给 $regex

如何在http get中将多个字符串传递给一个url?

如何在 PyQt5 中将字符串数组传递给 dbus? [复制]

如何在 Python 2 中将字符串传递给 subprocess.Popen? [复制]

如何在 mvc 视图中将剃刀值传递给 jquery 函数