如何在 Asp.Net 5 (MVC 6) 中使用 Entity Framework 6.x

How to Use Entity Framework 6.x in Asp.Net 5 (MVC 6)

我正在使用 VS 2015 CTP-6 测试新的 Asp.Net 5。由于 Entity Framework 7 中缺少功能,我现在更愿意使用 EF6。

我试过删除 EF7,然后在 PM 中应用 EF6,如下所示:

Uninstall-Package EntityFramework
Install-Package EntityFramework -version 6.1.3

没有返回错误,project.json 文件似乎已相应更新。虽然,没有可用的 DbContext。

这可能吗?如果是,我应该如何从这里开始?我需要 web.config 才能兼容 EF6 吗?

是的,这很好用。

您需要在创建上下文时手动设置连接字符串,因为它无法从 web.config

所以你可以这样做

public class MyContext : DbContext {
    public MyContext(string connectionString) : base(connectionString) {
    }
}

var context = new MyContext("myConnectionString");

如果你想从 config.json 获取连接字符串,那么试试这个

IConfiguration configuration = new Configuration().AddJsonFile("config.json");
var connectionString = configuration["Data:DefaultConnection:ConnectionString"]);

如果你想将上下文注入 DI 容器,那么我添加了一个这样的工厂

public static class MyContextFactory
{
    public static MyContext GetContext() {
        IConfiguration configuration = new Configuration().AddJsonFile("config.json");
        return new MyContext(configuration["Data:DefaultConnection:ConnectionString"]);
    }

}

然后在 startup.cs

中添加了这个
services.AddTransient<MyContext>((a) => MyContextFactory.GetContext());

你不能只在 startup.cs 文件中这样做吗?保存创建工厂

// new context on each request
services.AddScoped<IMyContext, MyContext>((s) =>
{
    return new MyContext(Configuration["Data:MyConnection:ConnectionString"]);
});

根据所使用的数据库,它可能不像回答的那么简单。如果您使用的是 MsSql,则无需配置,接受的答案完全没问题。但是使用 LocalDB 可能需要一些配置。

例如MySql需要注册供应商

[DbConfigurationType(typeof(CodeConfig))] // point to the class that inherit from DbConfiguration
public class ApplicationDbContext : DbContext
{
    [...]
}

public class CodeConfig : DbConfiguration
{
    public CodeConfig()
    {
        SetDefaultConnectionFactory(new MySql.Data.Entity.MySqlConnectionFactory());
        SetProviderServices("MySql.Data.MySqlClient",
                    new MySql.Data.MySqlClient.MySqlProviderServices());
    }
}

PostgreSql 需要将提供商注册到 entityFramework AND system.data 部分。这可以通过使用 System.Data.Entity.DbConfiguration.Loaded 事件来完成。 Oracle.

也是如此

查看此博客 post,其中详细解释了它:http://bleedingnedge.com/2015/11/01/entity-framework-6-with-asp-net-5/

对于 RC 版本,这变成:

        var builder = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json")
            .AddEnvironmentVariables();
        var Configuration = builder.Build();
        var connectionString = Configuration["Data:DefaultConnection:ConnectionString"];

‌开始之前,请确保在 project.json 中针对完整的 .NET Framework 进行编译,因为 Entity Framework 6 不支持 .NET Core。如果您需要跨平台功能,您需要升级到 Entity Framework 核心。

在您的 project.json 文件中为完整的 .NET Framework 指定一个目标:

"frameworks": {
    "net46": {}
}

然后设置连接字符串和依赖项注入

public class ApplicationDbContext : DbContext
{
    public ApplicationDbContext(string nameOrConnectionString) : base(nameOrConnectionString)
    {
    }
}

在 ConfigureServices 的 Startup class 中,添加上下文的工厂方法及其连接字符串。每个范围应解析一次上下文,以确保性能并确保 Entity Framework.

的可靠运行
public void ConfigureServices(IServiceCollection services)
{
    services.AddScoped((_) => new ApplicationDbContext(Configuration["Data:DefaultConnection:ConnectionString"]));

    // Configure remaining services
}

ntity Framework 6 允许在 xml(在 web.config 或 app.config 中)或通过代码指定配置。从 ASP.NET Core 开始,所有配置都是基于代码的。

基于代码的配置是通过创建 System.Data.Entity.Config.DbConfiguration 的子 class 并将 System.Data.Entity.DbConfigurationTypeAttribute 应用于您的 DbContext 子class.

我们的配置文件通常如下所示:

<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>

defaultConnectionFactory 元素设置连接工厂。如果未设置此属性,则默认值为 SqlConnectionProvider。另一方面,如果提供了值,则给定的 class 将用于通过其 CreateConnection 方法创建 DbConnection。如果给定的工厂没有默认构造函数,那么您必须添加用于构造对象的参数

[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 核心应用程序中使用 Entity Framework 6。 https://docs.asp.net/en/latest/data/entity-framework-6.html