我想在一个事务中使用telerik开放访问从多个表中删除 - 所以如果任何删除都有问题,它们都会回滚。
这是我在阅读文档后提出的代码,但是我怀疑每个'DeleteAll'都在运行一个单独的事务,而不是等到最后的'SaveChanges()'。真的吗? 如果是这样,我怎样才能完成我想要做的事情(即一次交易中的所有删除)?
int deleted = 0;
using (PortalContext dbContext = new PortalContext())
{
var bars = dbContext.GetAll<xxx>().Where(x => x.a == user.a && x.b == b && x.c >= sessionStart);
deleted += bars.DeleteAll();
var badss = dbContext.GetAll<yyy>().Where(x => x.a == user.a && x.b == b && x.c >= sessionStart);
deleted += badss.DeleteAll();
var bads = dbContext.GetAll<zzz>().Where(x => x.a == user.a && x.b == b && x.c >= sessionStart);
deleted += bads.DeleteAll();
var trades = dbContext.GetAll<aaa>().Where(x => x.a == user.a && x.b == b && x.c >= fromTime);
deleted += trades.DeleteAll();
var balances = dbContext.GetAll<bbb>().Where(x => x.a == user.a && x.b == b && x.c >= fromTime);
deleted += balances.DeleteAll();
dbContext.SaveChanges();
}
答案 0 :(得分:3)
你的怀疑是正确的。 DeleteAll立即在单独的事务中执行,不等待SaveChanges。因此,您必须使用普通的Delete方法。您将必须获取要删除的对象,然后遍历它们,为每个对象调用Delete,然后在最后调用SaveChanges:
using (EntitiesModel context = new EntitiesModel())
{
var rentalOrdersToDelete = context.RentalOrders.Where(order => order.RentalOrderID < 10);
var carsToDelete = context.Cars.Where(car => car.CarID < 5);
foreach (RentalOrder order in rentalOrdersToDelete)
{
context.Delete(order);
}
foreach (Car car in carsToDelete)
{
context.Delete(car);
}
context.SaveChanges();
}
请注意,将生成的类似SQL语句也将一起批处理,因此性能应该很好。
此外,如果您使用长生活上下文对象进行除此多次删除之外的各种其他操作,我建议确保上下文中没有其他挂起的更改(没有打开的事务),这样您就可以除了调用SaveChanges时的删除操作,不要秘密地将任何其他内容推送到数据库。您可以使用context.HasChanges属性来检查它。