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

时间:2016-12-13 06:50:13

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

在我的ASP.NET核心应用程序中,我有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:错误:发生异常   保存更改时在数据库中。   System.InvalidOperationException:对此启动了第二个操作   上一次操作完成前的上下文。任何实例成员   不保证是线程安全的。

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

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

但问题仍然存在。

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

PS:我正在使用PostgreSQL和Npgsql提供程序

2 个答案:

答案 0 :(得分:1)

问题在于在其他地方使用DB,因为ASP.NET Core Dependency Injection仅创建每个服务的单个实例。 我通过创建一个新的范围来解决它

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

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

答案 1 :(得分:0)

Class.Id是自动增量/序列字段吗?可能是EF在插入后查询数据库的值...尝试在首次保存后添加Console.WriteLine(Class.Id)await Context.Entry(Class).ReloadAsync()