在实体框架中,有一些条件在数据库级别处理,并作为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()一次,在循环结束之外,我的解决方案不起作用 - 任何人都可以建议一种可行的替代方法吗?
答案 0 :(得分:4)
像往常一样,我在询问某人后的15分钟内解决了这个问题:)
解决方案是在处理异常时从ObjectStateManager中删除实体对象,这允许循环继续:
while(i < 1000)
{
MyEntity Wibble = new MyEntity();
Wibble.Name = "Test " + i.ToString();
Context.AddToTests(Wibble);
try
{
Context.SaveChanges();
}
catch
{
Context.ObjectStateManager.GetObjectStateEntry(Wibble).Delete();
}
}