首页 > 解决方案 > 具有依赖注入的 Entity Framework Core 是如何处理的?

问题描述

在 Entity Framework Core 中,您通常会使用这样的东西,它应该适用于几乎所有情况:

using (var dbContext = new MyDbContext()) {
    await dbContext.Entities.WhereAsync(e => e.Something == somethingElse);
    await dbContext.SaveChangesAsync();
}

您还可以将依赖注入与数据库上下文一起使用。现在您可以将数据库上下文添加到 DI 容器中,并将其注入到您需要的类/控制器/构造器/方法中:

IHostBuilder builder = new HostBuilder()
    .ConfigureServices((context, collection) => {
        string connectionString = context.Configuration.GetConnectionString("MyDatabase");
        collection.AddDbContext<MyDbContext>();

...

public class Foo {
    public Foo(MyDbContext dbContext) { }
}

但是,将其注入类/构造函数中,您通常会将实例保留为局部变量,这很公平,但不再有任何可能使用这些using语句。现在两种不同的方法最终可能会同时使用相同的 dbContext,这很可能会导致并发问题。

如果 dbContext 没有被注入,而只是在using语句中使用,那么并发应该没有问题,并且该对象将在每个方法的末尾被释放。

那么,您将如何正确处理并发性并使用 Entity Framework Core 和依赖注入进行处理?

标签: c#dependency-injectionentity-framework-core

解决方案


默认情况下,扩展方法AddDbContext会:

services.AddScoped<MyDbContext>()

因此,在 的情况下AddDbContext,将为每个请求创建一个新实例,并在工作完成后释放(对象在请求中相同,但在不同请求中不同)。所以,这里的并发应该没有任何问题。

如果您需要为每个控制器和每个服务创建一个新实例,您还可以将上下文作为瞬态添加到 DI。


推荐阅读