在我的网络项目中,我尝试使用实体框架6模型第一方法。模型是从单独项目中的现有数据库中生成的。对于模型生成,连接字符串保存在数据访问项目的app.config中。在主web项目(ASP.NET Core )中,我试图在Startup.cs类中注入上下文创建。
下面是上下文部分类的代码。使用分部类,因为上下文是从模板自动生成的。
[DbConfigurationType(typeof(EntityFrameworkConfig))]
public partial class MyEntities
{
public MyEntities(String name) : base(name)
{
}
}为了使用代码中的实体框架配置,而不是不能与app.config核心项目一起使用的asp.net,我从System.Data.Entity.DbConfiguration继承了配置类。
public class EntityFrameworkConfig : DbConfiguration
{
public EntityFrameworkConfig()
{
this.SetDefaultConnectionFactory(new SqlConnectionFactory());
this.SetProviderServices(SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance);
}
}在web项目中的config.json中,我有连接字符串:
{
"MailSettings": {
"ToAddress": "foo@bar.com"
},
"Connection": {
"ConnectionString": "data source=SERVER;initial catalog=DB;user id=user;password=pwd;MultipleActiveResultSets=True;App=EntityFramework;"
}
}在Startup.cs中:
public void ConfigureServices(IServiceCollection services)
{
...
String connStr = _config["Connection:ConnectionString"];
services.AddScoped((_) => new MyEntities(connStr));
...}
我正在体验从自动生成的上下文类的UnintentionalCodeFirstException事件中抛出的OnModelCreating:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}这是使用实体框架6模型的正确方法吗?首先使用asp.net Core项目,这一异常的原因是什么?
发布于 2016-09-15 07:53:45
经过深入研究,我发现解决方案是提供实体框架格式的连接字符串,使DbContext类能够加载模型元数据。
在Startup.cs中:
String connStr = _config["Connection:ConnectionString"];
String efConnString = BuildConnectionString(connStr);
services.AddScoped((_) => new MyEntities(efConnString));
....
....
private String BuildConnectionString(String cs)
{
EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
entityBuilder.Provider = "System.Data.SqlClient";
entityBuilder.ProviderConnectionString = cs;
entityBuilder.Metadata = @"res://*/XXXWebModel.csdl|
res://*/XXXWebModel.ssdl|
res://*/XXXWebModel.msl";
return entityBuilder.ToString();
}当以不包含元数据信息的格式提供连接字符串时,在哪里查找生成的模型实体框架会发现使用了代码优先方法,这就是为什么调用方法OnModelCreating引发异常的原因:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
} 发送包含元数据信息的实体框架连接字符串格式的连接字符串解决了问题。
发布于 2016-09-13 08:07:13
在使用ASP.net核心和EF 6时,您应该遵循以下步骤:这是一个example.You必须根据您的用例对其进行更改的步骤。
步骤1 : project.json
为完整的.NET框架指定一个目标:
"frameworks": {
"net46": {}
}步骤2 :安装连接字符串和依赖项注入
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(string nameOrConnectionString) : base(nameOrConnectionString)
{
}
}Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped((_) => new ApplicationDbContext(Configuration["Data:DefaultConnection:ConnectionString"]));
// Configure remaining services
}步骤3 :将配置从配置迁移到代码
实体框架6允许使用xml (在web.config或app.config中)或通过代码指定配置。从ASP.NET核心开始,所有配置都是基于代码的.
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="mssqllocaldb" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>:
[DbConfigurationType(typeof(CodeConfig))] // point to the class that inherit from DbConfiguration
public class ApplicationDbContext : DbContext
{
[...]
}
public class CodeConfig : DbConfiguration
{
public CodeConfig()
{
SetProviderServices("System.Data.SqlClient",
System.Data.Entity.SqlServer.SqlProviderServices.Instance);
}
}https://stackoverflow.com/questions/39464311
复制相似问题