我现在在使用EF的时候,都是用foreach的形式,去增加/修改/删除大批量的数据,我用profile查看,发现EF为每笔数据都生成了一条SQL语句,而且感觉速度明显有点慢。请问,EF有批量处理的功能吗?
of course
how to implement it?
在循环外SaveChange
具体怎么写?
SaveChanges(false)+AcceptAllChanges()
using (TransactionScope scope = new TransactionScope()) { //Do something with context1 //Do something with context2 //Save Changes but don't discard yet context1.SaveChanges(false); //Save Changes but don't discard yet context2.SaveChanges(false); //if we get here things are looking good. scope.Complete(); context1.AcceptAllChanges(); context2.AcceptAllChanges(); }
我用的是Entity Framework 5.0,context是继承于DbContext的。我在VS里看了,context没有带bool参数的SaveChanges()方法。另外你似乎没明白我的问题。我的问题是,下面的这段代码用于删除与contractInfo关联的所有ContractPlan记录。因为我没发现批量删除方法,所有只能用foreach逐个删除,假如plans的长度是100,我发现EF生成了100条用于删除ContractPlan的语句,这是个问题。
List<ContractPlan> plans = contractInfo.ContractPlans.ToList();
foreach (ContractPlan item in plans)
{
context.ContractPlans.Remove(item);
}
@Jeffrey.Liang:
你使用了ToList(),所以会发现有100条删除,这是个问题的所在……
@雪美·考拉:
我按照你说的,将代码改成了这样:
ICollection<ContractPlan> plans = contractInfo.ContractPlans;
foreach (ContractPlan item in plans)
{
context.ContractPlans.Remove(item);
}
在执行foreach的时候,会报“集合已修改;可能无法执行枚举操作。”的异常。
savechanges()
貌似是木有批量删除的方法的.还得一个个标记删除,最后一次保存,但是还是很多条删除语句的.