C# 在循环中处理SaveChanges异常

C# 在循环中处理SaveChanges异常,c#,entity-framework,C#,Entity Framework,在实体框架中,有一些条件是在数据库级别处理的,并在Context.SaveChanges()上作为异常传递回EF 如果在循环中创建新实体,可以通过标准的“Try Catch”块处理异常,但是如何从SaveChanges()队列中清除有问题的实体 例如(将SaveChanges移到循环之外不会产生任何积极的影响,因此它在循环中显示): while(i

在实体框架中,有一些条件是在数据库级别处理的,并在Context.SaveChanges()上作为异常传递回EF

如果在循环中创建新实体,可以通过标准的“Try Catch”块处理异常,但是如何从SaveChanges()队列中清除有问题的实体

例如(将SaveChanges移到循环之外不会产生任何积极的影响,因此它在循环中显示):

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();
    }

}