C# 注册DbContext服务

C# 注册DbContext服务,c#,asp.net-core,dependency-injection,.net-core,C#,Asp.net Core,Dependency Injection,.net Core,我在读一本书,对存储库感到困惑,下面是代码: public class ApplicationDbContext : DbContext { public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options): base(options) { } public DbSet<Product> Products { get; set; } } 或者services.AddDbC

我在读一本书,对存储库感到困惑,下面是代码:

public class ApplicationDbContext : DbContext
{
   public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options): base(options) { }

   public DbSet<Product> Products { get; set; }
}
或者
services.AddDbContext
services.AddTransient()具有相同的效果


Q2 ApplicationDbContext还有一个构造函数,它需要一个
DbContextOptions
对象选项,那么这个选项是如何注册的呢?

您的两个问题都可以通过检查这一行来回答:

services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration["Data:SportStoreProducts:ConnectionString"]));

正在创建DbContext构造函数所需的
DbContextOptions
对象。因此,它“技术上”并没有注册为可解析类型,但整行代码让应用程序知道如何在请求时创建
ApplicationDbContext

@secondimage没问题。如果你需要一个好的资源,我建议这本书,你可以在亚马逊或类似网站上找到它,而且价格也不错。顺便问一下,为什么。AddDbContext是否注册一个临时对象?它不应该注册一个单例对象吗?因为数据库配置(如连接字符串)不会改变吗?不会。对于DbContext来说,Singleton实际上是最糟糕的生存期/作用域。DbContext应该只存在于它所用于的任务的生命周期内;对于web应用程序,这通常是“每个请求”,这意味着在请求开始时创建上下文,在请求结束时处理上下文。您必须记住,在运行任何查询时,EntityFramework(默认情况下)将在其缓存中存储获取数据的快照。这意味着如果您正在进行更改,它很快就会过时。对不起,我对EF不是很熟悉,那么为什么要尽快处理DbContext呢?EF不是可以创建尽可能多的DBContext来服务吗?你能给我一个例子,如果dbcontext是单例,会发生什么?这是一个非常广泛的主题。您可能想查看其中一个聊天室,尽管我没有看到专门用于实体框架的聊天室。这有点技术性,但有一些有用的信息:
public void ConfigureServices(IServiceCollection services)
{
   services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration["Data:SportStoreProducts:ConnectionString"]));

   services.AddTransient<IProductRepository, EFProductRepository>();
}
services.AddTransient<ApplicationDbContext, ...>();
services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration["Data:SportStoreProducts:ConnectionString"]));
options => options.UseSqlServer(Configuration["Data:SportStoreProducts:ConnectionString"])