在 ASP.NET Core 中设置实体框架

问题描述 投票:0回答:3

我正在开发一个在完整

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();
    
c# entity-framework asp.net-core
3个回答
3
投票

问题1:System.Data.Entity.DbContext

问题2:

services.AddScoped(provider => new MyContext(ConString));

您希望每个网络请求有 1 个上下文

问题3:你不需要这个

这些其他扩展用于使用 EF Core 而不是 EF 6


0
投票
关于

AddEntityFrameworkSqlServer()

如果您在 ASP.NET 中使用:

您根本不应该在 ASP.NET 容器上调用 AddEntityFrameworkSqlServer() - 它会在该容器上配置所有 EF 服务;几乎在所有情况下使用 EF 的正确方法是让它配置自己的内部服务提供者。换句话说,只需按照所有教程中的指示调用 UseSqlServer(),EF 将设置一个内部 DI 服务提供程序(与 ASP.NET 完全不同),并在那里配置自己的内部 IMemoryCache。

来自

https://github.com/dotnet/efcore/issues/12905


-1
投票

第一个问题: using Microsoft.EntityFrameworkCore;

 在我的项目中效果很好。

第二个问题:你的第一种方法是正确的

第三个问题: 如果你像这样配置所有内容,则不需要添加services.AddEntityFrameworkSqlServer();


    

© www.soinside.com 2019 - 2024. All rights reserved.