【发布时间】:2020-05-15 05:30:59
【问题描述】:
我需要RemoveRange(总记录),然后将新数据添加到表中。在此我收到以下错误:
在前一个操作完成之前,在此上下文中启动了第二个操作。这通常是由使用相同 DbContext 实例的不同线程引起的,但不能保证实例成员是线程安全的。这也可能是由于在客户端上评估嵌套查询造成的,如果是这种情况,请重写查询以避免嵌套调用。
下面是我的代码
using (var transaction = context.Database.BeginTransaction())
{
List<Permission> permission = context.permissions.ToList();
context.permissions.RemoveRange(permission);
context.SaveChangesAsync();
var permissions = new Permission[]
{
new Permission { PermissionId=1, Resource = "User Info", CanMenuItem = true ,Action= "Get", AppICON="User.jpg", WebICON="ft-users", APPURI="UserPage", WebURI="", IsActive=true, Notify=false, UpdatedOn = System.DateTime.Now, SortBy = 1 },
new Permission { PermissionId=2, Resource = "User", CanMenuItem = false ,Action= "Get", AppICON="User.jpg", WebICON="", APPURI="UserPage", WebURI="/user", IsActive=true, Parent=1, Notify=false, UpdatedOn = System.DateTime.Now, SortBy = 1 },
new Permission { PermissionId=3, Resource = "User", Action= "Post", AppICON="", WebICON="", APPURI="", WebURI="", IsActive=true, Notify=false, UpdatedOn = System.DateTime.Now },
new Permission { PermissionId=4, Resource = "User", Action= "Put", AppICON="", WebICON="", APPURI="", WebURI="", IsActive=true, Notify=false, UpdatedOn = System.DateTime.Now },
new Permission { PermissionId=5, Resource = "User", Action= "Delete", AppICON="", WebICON="", APPURI="", WebURI="", IsActive=true, Notify=false, UpdatedOn = System.DateTime.Now },
}
context.permissions.AddRange(permissions);
context.Database.ExecuteSqlCommand(@"SET IDENTITY_INSERT [dbo].[Permission] ON");
context.SaveChanges();
context.Database.ExecuteSqlCommand(@"SET IDENTITY_INSERT [dbo].[Permission] OFF");
}
我想从表中删除所有数据并在同一次调用中向表中添加新数据?
【问题讨论】:
-
请对
SaveChangesAsync()方法使用异步等待或将其重命名为SaveChanges()。我认为这会导致您出现异常。 -
@Richard Baldauf ...是的,这就是原因......现在使用 savechanges() 可以正常工作
-
Nooo... 你有一个有效的 async/await 树设置,为什么要同步执行这样一个可能很长的操作?现在您可能会收到警告“不包含等待并且将...”,因为您的方法仍被标记为异步,但您没有执行任何异步操作
-
Btw ExecuteSqlCommand 已过时。必须使用 ExecuteSqlRaw。
-
第一个
SaveChangesAsync调用开始在与主线程不同的线程中运行操作。如果在调用SaveChanges时它没有完成,你会得到这个错误。为避免这种情况,您必须等待第一个操作完成。正如所指出的,您在这里有几个选择。如果您想保留async电话,您可以await它。或者将SaveChangesAsync更改为SaveChanges也可以,因为下一条语句在完成之前不会执行。
标签: c# sql-server entity-framework linq asp.net-core