如何在 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
我正在使用 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