我有一个包含两个项目的解决方案:ASP.NET5Web项目和带有EF6的类库。在旧的ASP.NET 4世界中,我有一个带有构造函数的DbContext类:
public MyModel() : base("name=MyModel") { }
然后在web应用程序中,我在web.config中有一个连接字符串。我还有一个DefaultConnection值,用于基于成员身份的标识。
现在我正在尝试使用ASP.NET 5。默认连接字符串以"新"的方式工作(我从零开始标识,最终无论如何都不会使用基于数据库的身份验证)-我正在正确地进行身份验证。默认连接字符串在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和服务派生的。AddDbContext<>()不喜欢。
在这个时候,我觉得我尝试了谷歌能买到的所有排列。将ASP.NET 5与EF6类库一起使用的正确方法是什么?
我尝试了@Ryan的#2方法,它在一定程度上起了作用,但通过传递连接字符串(或SqlConnection
对象)实例化DbContext
会告诉EF创建代码优先上下文,在我的情况下,EDMX的类与代码优先不兼容。EDMX的类(poco,如果你愿意的话)必须是代码优先友好的,否则就无法工作。
我的解决方案是简单地在web项目中添加App.config
文件。
我不喜欢这种变通方法,但当你必须使用EF 6和ASP.NET 5 web项目时,你必须做你该做的。
应用程序配置
<?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="data source=.;initial catalog=Db_Local;integrated security=True;multipleactiveresultsets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
</connectionStrings>
</configuration>
您有几个相当简单的选项:
1:开始使用实体框架7。
- 它的发布时间表是与Asp.net 5协调安排的,尽管有些功能可能会缺失一段时间
- 然后,您可以使用AddDbContext,就像您已经尝试过的那样
2:您可以在创建上下文时将整个连接字符串传递给构造函数/库,使用Asp.net配置从json-config中提取值。
public MyModel(string connectionString) : base(connectionString) { }
- EF6中的基本上下文需要连接字符串的名称(在配置中查找)或实际连接字符串本身
我发现的最简单的方法就是在web.config中添加一个带有连接字符串的键,该连接字符串可以通过ConfigurationManager访问。
<add key="ConnectionString" value="..." />
System.Configuration.ConfigurationManager.AppSettings["ConnectionString"].ToString());