我正在开发一个在完整
ASP.NET Core
下运行的.NET Framework 4.6.1
应用程序。我正在使用 Entity Framework 6
,因为 Entity Framework Core
目前有一些限制(特别是多对多关系)。我试图了解如何通过 ASP.NET Core
的依赖注入正确设置和使用实体框架。
问题1
MyContext 应该继承
System.Data.Entity.DbContext
还是 Microsoft.Data.Entity.DbContext
?
问题2
以下哪一项是将其设置为服务的正确方法,以便可以将其注入到构造函数中?
private const string ConString = "myConnectionString";
public void ConfigureServices(IServiceCollection services)
{
//FIRST WAY - requires MyContext to be of type Microsoft.Data.Entity.DbContext
services.AddDbContext<MyContext>(options => { });
//SECOND WAY - requires MyContext to be of type Microsoft.Data.Entity.DbContext
services.AddEntityFramework.AddDbContext<MyContext>(options => { });
//THIRD WAY
services.AddTransient(provider => new MyContext(ConString));
//FOURTH WAY
services.AddScoped(provider => new MyContext(ConString));
}
尽管
AddTransient
和 AddScoped
之间的差异在文档中有明确定义。
问题3
假设我使用的是 SQL Server,在上述哪种情况下需要这样做?
services.AddEntityFrameworkSqlServer();
问题1:System.Data.Entity.DbContext
问题2:
services.AddScoped(provider => new MyContext(ConString));
您希望每个网络请求有 1 个上下文
问题3:你不需要这个
这些其他扩展用于使用 EF Core 而不是 EF 6
AddEntityFrameworkSqlServer()
:如果您在 ASP.NET 中使用:
您根本不应该在 ASP.NET 容器上调用 AddEntityFrameworkSqlServer() - 它会在该容器上配置所有 EF 服务;几乎在所有情况下使用 EF 的正确方法是让它配置自己的内部服务提供者。换句话说,只需按照所有教程中的指示调用 UseSqlServer(),EF 将设置一个内部 DI 服务提供程序(与 ASP.NET 完全不同),并在那里配置自己的内部 IMemoryCache。来自
第一个问题:
using Microsoft.EntityFrameworkCore;
在我的项目中效果很好。
第二个问题:你的第一种方法是正确的
第三个问题: 如果你像这样配置所有内容,则不需要添加services.AddEntityFrameworkSqlServer();