C# 在循环中处理SaveChanges异常
在实体框架中,有一些条件是在数据库级别处理的,并在Context.SaveChanges()上作为异常传递回EF 如果在循环中创建新实体,可以通过标准的“Try Catch”块处理异常,但是如何从SaveChanges()队列中清除有问题的实体 例如(将SaveChanges移到循环之外不会产生任何积极的影响,因此它在循环中显示):C# 在循环中处理SaveChanges异常,c#,entity-framework,C#,Entity Framework,在实体框架中,有一些条件是在数据库级别处理的,并在Context.SaveChanges()上作为异常传递回EF 如果在循环中创建新实体,可以通过标准的“Try Catch”块处理异常,但是如何从SaveChanges()队列中清除有问题的实体 例如(将SaveChanges移到循环之外不会产生任何积极的影响,因此它在循环中显示): while(i
while(i<1000)
{
MyEntity Wibble=新的MyEntity();
Wibble.Name=“Test”+i.ToString();
Context.AddToTests(Wibble);
SaveChanges();
}
如果出于某种原因,已经存在一个Wibble,它会导致插入在数据库中的唯一约束上失败,那么我可以处理循环中的立即异常
但是,它在下一次迭代中再次失败,因为有问题的Wibble实例仍然存在于SaveChanges队列中-您应该如何处理这个问题
您当然可以事先检查我们是否正在创建一个重复的Wibble,但这会导致数据库的两次往返。我不介意处理这个异常,我只是想知道这个问题,忽略那个记录,继续前进
想法?我做错了吗
编辑:
我已经解决了眼前的问题,但仅限于在循环中执行Context.SaveChanges()时。如果只调用一次SaveChanges(),在循环结束之外,我的解决方案不起作用-有人能推荐一种可行的替代方法吗?像往常一样,我在询问某人后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();
}
}
while(i<1000)
{
MyEntity Wibble=新的MyEntity();
Wibble.Name=“Test”+i.ToString();
Context.AddToTests(Wibble);
尝试
{
SaveChanges();
}
抓住
{
Context.ObjectStateManager.GetObjectStateEntry(Wibble.Delete();
}
}
只是一条注释:您应该将更改保存在循环之外,这样您只需访问数据库一次,而不是千次。如果您正在更新或删除以及添加,请查看以下帖子:
while(i < 1000)
{
MyEntity Wibble = new MyEntity();
Wibble.Name = "Test " + i.ToString();
Context.AddToTests(Wibble);
try
{
Context.SaveChanges();
}
catch
{
Context.ObjectStateManager.GetObjectStateEntry(Wibble).Delete();
}
}