首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在实体框架6中首先创建DbContext模型

在实体框架6中首先创建DbContext模型
EN

Stack Overflow用户
提问于 2016-09-13 07:22:38
回答 2查看 1.4K关注 0票数 1

在我的网络项目中,我尝试使用实体框架6模型第一方法。模型是从单独项目中的现有数据库中生成的。对于模型生成,连接字符串保存在数据访问项目的app.config中。在主web项目(ASP.NET Core )中,我试图在Startup.cs类中注入上下文创建。

下面是上下文部分类的代码。使用分部类,因为上下文是从模板自动生成的。

代码语言:javascript
复制
[DbConfigurationType(typeof(EntityFrameworkConfig))]
public partial class MyEntities
{
    public MyEntities(String name) : base(name)
    {    
    }
}

为了使用代码中的实体框架配置,而不是不能与app.config核心项目一起使用的asp.net,我从System.Data.Entity.DbConfiguration继承了配置类。

代码语言:javascript
复制
public class EntityFrameworkConfig : DbConfiguration
{
    public EntityFrameworkConfig()
    {
         this.SetDefaultConnectionFactory(new SqlConnectionFactory());
         this.SetProviderServices(SqlProviderServices.ProviderInvariantName,       SqlProviderServices.Instance);
    }
}

在web项目中的config.json中,我有连接字符串:

代码语言:javascript
复制
{
    "MailSettings": {
    "ToAddress": "foo@bar.com"
    },
    "Connection": {
    "ConnectionString": "data source=SERVER;initial catalog=DB;user id=user;password=pwd;MultipleActiveResultSets=True;App=EntityFramework;"
    }
}

在Startup.cs中:

代码语言:javascript
复制
public void ConfigureServices(IServiceCollection services)
{
    ...

    String connStr = _config["Connection:ConnectionString"];
    services.AddScoped((_) => new MyEntities(connStr));
    ...

}

我正在体验从自动生成的上下文类的UnintentionalCodeFirstException事件中抛出的OnModelCreating:

代码语言:javascript
复制
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    throw new UnintentionalCodeFirstException();
}

这是使用实体框架6模型的正确方法吗?首先使用asp.net Core项目,这一异常的原因是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-15 07:53:45

经过深入研究,我发现解决方案是提供实体框架格式的连接字符串,使DbContext类能够加载模型元数据。

在Startup.cs中:

代码语言:javascript
复制
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引发异常的原因:

代码语言:javascript
复制
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    throw new UnintentionalCodeFirstException();
}  

发送包含元数据信息的实体框架连接字符串格式的连接字符串解决了问题。

票数 0
EN

Stack Overflow用户

发布于 2016-09-13 08:07:13

在使用ASP.net核心和EF 6时,您应该遵循以下步骤:这是一个example.You必须根据您的用例对其进行更改的步骤。

步骤1 : project.json

为完整的.NET框架指定一个目标:

代码语言:javascript
复制
"frameworks": {
    "net46": {}
}

步骤2 :安装连接字符串和依赖项注入

代码语言:javascript
复制
public class ApplicationDbContext : DbContext
{
    public ApplicationDbContext(string nameOrConnectionString) : base(nameOrConnectionString)
    {
    }
}

Startup.cs

代码语言:javascript
复制
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核心开始,所有配置都是基于代码的.

代码语言:javascript
复制
<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>

:

代码语言:javascript
复制
[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);
    }
}

参考: ASP.NET Core and Entity Framework 6

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39464311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档