在实体框架中,有一些条件是在数据库级别处理的,并作为context.savechanges()上的异常返回到ef。
如果要在循环中创建新实体,可以通过标准的“try catch”块处理异常,但如何从savechanges()队列中清除有问题的实体?
例如(将savechanges移动到循环之外没有积极的效果,因此它在循环中显示在这里):
while(i < 1000)
{
MyEntity Wibble = new MyEntity();
Wibble.Name = "Test " + i.ToString();
Context.AddToTests(Wibble);
Context.SaveChanges();
}
如果由于某种原因,已经存在一个wibble,导致插入在数据库中的唯一约束上失败,那么我可以在循环中处理立即异常。
但是,它在下一次迭代中再次失败,因为有问题的wibble实例仍然存在于savechanges队列中-您应该如何处理这个问题?
您当然可以预先检查我们是否创建了一个重复的wibble,但这会导致两次到数据库的往返。我不介意处理异常,我只是想知道这个问题,忽略那个记录,然后继续。
思想?我做错了吗?
编辑:
我已经解决了当前的问题,但仅当您在循环中执行context.saveChanges()时。如果您只调用一次savechanges(),在循环结束之后,我的解决方案就不起作用了——有人能推荐一个可以起作用的替代方法吗?