【发布时间】:2020-07-29 21:06:30
【问题描述】:
我正在调试一些旧代码,其中原始开发人员执行以下操作:
public bool ProcessFooStuff()
{
List<Foo> fooList;
using (var dbContext = new FooEntities())
{
var id = 1;
fooList= _fooRepository.GetFoo(dbContext, id);
}
ProcessFooList(fooList);
}
public List<Foo> GetFoo(FooEntitiesdbContext, int id)
{
List<Foo> fooList;
try
{
fooList = dbContext.Foo.Where(f => f.id == id).ToList();
}
catch
{
}
return fooList;
}
public bool ProcessFooList(List<Foo> fooList)
{
using (var dbContext = new FooEntities())
{
.
.
.
fooList.RemoveAll(f => f.Id = x);
.
.
.
dbContext.SaveChanges();
}
}
Foo 表中的项目被意外删除存在间歇性问题。我推测这是因为第一个 USING 块上的 IDispose 没有清理它的 fooList 实例,因为它的范围在块之外,并且传递给方法 fooList 中的 SaveChanges 正在作用于它。
谁能证实或揭穿?
谢谢。
【问题讨论】:
-
removeall 删除,为什么会出乎意料?您在 .... 行中有什么代码?
-
GetFoo返回的对象的实际类型是什么?不是被申报的,是实际被退回的?它是一个实际的List<Foo>还是一个从List<T>继承的列表对象,并且以某种方式与数据库上下文相关联或诸如此类?如果它只是一个List<T>,那么它不会从基础表中删除任何内容。 -
我没有关注。你说不清理它的Foo实例。我在您的代码中没有看到任何 Foo 实例,只有
List<Foo>。列表没有实现Disposable,所以没关系。然后将该(仅在内存中)列表传递给ProcessFoo,它会在执行一些数据库工作时从内存列表中删除部分或全部项目。但是,这与数据库无关。对不起,否则我没有听懂你在说什么/问什么 -
RemoveAll后...中的代码是在排除fooList后向Foo表中添加记录。所有参数都作为 List
传递我希望澄清的是,由于原始 List fooList 是否在 Using 块之外声明,因此在 begin 传递到 ProcessFooList 和ProcessFooList 中的 SaveChanges 正在删除它不打算删除的内容。我在这里认真地抓住稻草,因为除了发誓他永远不会从桌子上删除东西的人之外,我已经没有其他选择了。 -
您希望我们对您不显示的代码发表评论吗?除非一个类实现了 Disposable,否则它不关心
using。您的 Foo 列表在 ProcessFooStuff 和 GetFoo 的函数范围内声明。所以,你可以退货。然后它作为参数传递给 ProcessFooList,因此它不符合收集条件。调试时你看到了什么?