c# - 在 EF Core 中执行两个相关操作

标签 c# entity-framework postgresql asp.net-core entity-framework-core

在我的 ASP.NET Core 应用程序中,我有 DbContext,它包含两种类型的实体,例如 Pupils 和 Classes。我想添加一个新类,获取新类的 Id 并向该类添加一个新的 Pupil。 我试着这样做:

var Class = new Class{ name = "Math" };
Context.Classes.Add(Class);
await Context.SaveChangesAsync();
var Pupil = new Pupil{ name = "Rem", ClassId = Class.Id };
Context.Pupils.Add(Pupil);
await Context.SaveChangesAsync();

但是我在第二次调用 SaveChangesAsync() 时遇到错误:

Microsoft.EntityFrameworkCore.DbContext:Error: An exception occurred in the database while saving changes. System.InvalidOperationException: A second operation started on this context before a previous operation completed. Any instance members are not guaranteed to be thread safe.

我试图以这种方式将所有内容包装在事务中:

using (var transaction = Context.Database.BeginTransaction()) {
    ....
    transaction.Commit();
}

但问题依旧。

在 EF Core 中执行两个相关操作的正确方法是什么?是否可以在单笔交易中完成?

PS:我正在使用带有 Npgsql 提供程序的 PostgreSQL

最佳答案

问题在于在其他地方使用数据库,因为 ASP.NET Core 依赖注入(inject)仅创建每个服务的单个实例。 我通过创建一个新范围解决了这个问题

public MyService(IServiceProvider provider) { ... };
....

var Scope = provider.CreateScope();            
var Context = Scope.ServiceProvider.GetService<ShellDbContext>();

关于c# - 在 EF Core 中执行两个相关操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41115159/

相关文章:

c# - Linq 选择最高 ID,其中 ID 是字母数字

c# - 如何检测 UI 和游戏对象上的点击/触摸事件

c# - 绑定(bind)到 XAML 中的 Xamarin Picker SelectedItem 而不是重新加载表单

PostgreSQL - 确定列存储类型

c# - 如何通过主键和外键(右连接)合并两个数据表?

c# - 替代 .ToList() 以返回大量数据?

entity-framework - 如何使用 Entity Framework 代码优先迁移影响列顺序

c# - 错误消息将使用枚举与 EF 和 Web API

postgresql - 更改数字在 psql 中的打印方式

ruby-on-rails - Rake 回滚迁移