c# - 具有依赖注入的 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 和依赖注入进行处理?
解决方案
默认情况下,扩展方法AddDbContext
会:
services.AddScoped<MyDbContext>()
因此,在 的情况下AddDbContext
,将为每个请求创建一个新实例,并在工作完成后释放(对象在请求中相同,但在不同请求中不同)。所以,这里的并发应该没有任何问题。
如果您需要为每个控制器和每个服务创建一个新实例,您还可以将上下文作为瞬态添加到 DI。
推荐阅读
- python - 导入熊猫时有什么方法可以直接合并csv文件吗?
- javascript - 生成存储在 hdfs 中的 md5sum
- svn - SVN 访问主干外的文件 - 避免标签和分支中的问题
- reactjs - 在 React 中导入插件 js 文件时元素未定义错误
- nginx - 如何为 GKE gRPC 设置 NGINX Ingress
- r - 在R中循环以提取列表列表
- java - 升级到 Quarkus 1.3.0-FINAL 后运行测试时出现 NoSuchMethodException 错误
- ruby - 如何在 ruby 中进一步编码我的 merge_sort 方法?
- css - 为什么我的背景颜色不是从 CSS 中应用的?
- xamarin.forms - 登录用户并导航回首页 Shell