Moo*_*Moo 4 c# entity-framework
在实体框架中,有一些条件在数据库级别处理,并作为 Context.SaveChanges() 上的异常传递回 EF。
如果您在循环中创建新实体,您可以通过标准的“Try Catch”块处理异常,但如何从 SaveChanges() 队列中清除有问题的实体?
例如(将 SaveChanges 移到循环之外没有任何积极影响,因此它在循环内显示在此处):
while(i < 1000)
{
MyEntity Wibble = new MyEntity();
Wibble.Name = "Test " + i.ToString();
Context.AddToTests(Wibble);
Context.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
如果由于某种原因,已经存在导致插入在数据库中的唯一约束上失败的 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();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2916 次 |
| 最近记录: |