在 ASP.NET 5/EF 6 中获取数据库连接字符串

Getting database connection string in ASP.NET 5/EF 6

我有两个项目的解决方案:ASP.NET 5 Web 项目和 Class 带 EF6 的库。在旧的 ASP.NET 4 世界中,我有 DbContext class 和构造函数:

public MyModel() : base("name=MyModel") {    }

然后在 Web 应用程序中我在 web.config 中有连接字符串。我还有一个 DefaultConnection 值,用于基于成员身份的标识。

现在我正在尝试到达 ASP.NET 5。默认连接字符串以 "new" 方式工作(我从头开始身份验证,最终我无论如何都不会使用基于数据库的身份验证) - 我得到正确的认证。默认连接字符串在 appsettings.json 中。但是,无论我尝试什么,我都会收到错误 No connection string named 'MyModel' could be found in the application config file。我尝试按照 的建议将 name=MyModel 更改为 name=Data:AAOModel:ConnectionString,但我仍然得到与新值相同的异常。

appsettings.json 的相关部分是这样的(我意识到我可以拆分成 config.json - 但它没有任何区别):

"Data": {
"DefaultConnection": {
  "ConnectionString": "Server=(localdb)\MSSQLLocalDB;Database=..."
},
"MyModel": {
  "ConnectionString": "Server=dbserver;Database=BusinessDB..."
}

}

我还尝试在 Startup 中使用 ConfigureServices(),就像在脚手架代码中添加 IdentityContext 的方式和描述的那样 。但是,我注意到 IdentityContext 派生自 Microsoft.Data.Entity 但我的 MyModel 派生自 System.Data.Entity,并且 services.AddDbContext<>() 不喜欢它。

此时感觉Google能买到的所有排列我都试过了。将 ASP.NET 5 与 EF6 class 库一起使用的正确方法是什么?

您有几个相当简单的选择:

1: 开始使用 Entity Framework 7.

  • 它的发布时间表与 Asp.net 5 协调,但某些功能可能暂时缺失
  • 然后您将使用您已经尝试过的 AddDbContext

2:您可以在创建上下文时将整个连接字符串传递给 constructor/base,使用 Asp.net 配置从 json 配置中提取值。

public MyModel(string connectionString) : base(connectionString) { }

  • EF6 中的基本上下文需要连接字符串的名称(以在配置中查找)或实际的连接字符串本身。

我尝试了@Ryan 的#2 方法并且它有些工作,但是通过传递连接字符串(或 SqlConnection 对象)实例化 DbContext 将告诉 EF 创建 Code First 上下文,这在我的在这种情况下,EDMX 的 类 不兼容代码优先。 EDMX 的 类(poco,如果你愿意的话)必须是 Code First 友好的,否则将无法工作。

我的解决方案是在 Web 项目中简单地添加 App.config 文件。

我不喜欢这种解决方法,但是当你必须使用 EF 6 和 ASP.NET 5 网络项目时,你必须做你必须做的事情。

App.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <connectionStrings>
    <add name="SomethingEntities" connectionString="metadata=res://*/Entities.Something.Entities.csdl|res://*/Entities.Something.Entities.ssdl|res://*/Entities.Something.Entities.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.\;initial catalog=Db_Local;integrated security=True;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
</configuration>

我发现的最简单的方法就是在 web.config 中添加一个键,其中包含可通过 ConfigurationManager 访问的连接字符串。

 <add key="ConnectionString" value="..." />

System.Configuration.ConfigurationManager.AppSettings["ConnectionString"].ToString());