gpt4 book ai didi

c# - 在循环中处理 SaveChanges 异常

转载 作者:行者123 更新时间:2023-11-30 15:49:30 24 4
gpt4 key购买 nike

在 Entity Framework 中,有一些条件在数据库级别处理,并作为 Context.SaveChanges() 上的异常传递回 EF。

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

例如(将 SaveChanges 移到循环外没有任何积极影响,因此它显示在循环内):

while(i < 1000)
{
MyEntity Wibble = new MyEntity();
Wibble.Name = "Test " + i.ToString();

Context.AddToTests(Wibble);
Context.SaveChanges();

}

如果由于某种原因,已经存在导致数据库中的唯一约束插入失败的 Wibble,我可以在循环中处理即时异常。

但是,它在下一次迭代中再次失败,因为有问题的 Wibble 实例仍然存在于 SaveChanges 队列中 - 你应该如何处理它?<​​/p>

您当然可以事先检查我们是否正在创建重复的 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();
}

}

关于c# - 在循环中处理 SaveChanges 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1537835/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com