【问题标题】:Looking for clarification on use of USING in C#寻找有关在 C# 中使用 USING 的说明
【发布时间】: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&lt;Foo&gt; 还是一个从List&lt;T&gt; 继承的列表对象,并且以某种方式与数据库上下文相关联或诸如此类?如果它只是一个List&lt;T&gt;,那么它不会从基础表中删除任何内容。
  • 我没有关注。你说不清理它的Foo实例。我在您的代码中没有看到任何 Foo 实例,只有 List&lt;Foo&gt;。列表没有实现Disposable,所以没关系。然后将该(仅在内存中)列表传递给ProcessFoo,它会在执行一些数据库工作时从内存列表中删除部分或全部项目。但是,这与数据库无关。对不起,否则我没有听懂你在说什么/问什么
  • RemoveAll后...中的代码是在排除fooList后向Foo表中添加记录。所有参数都作为 List 传递我希望澄清的是,由于原始 List fooList 是否在 Using 块之外声明,因此在 begin 传递到 ProcessFooList 和ProcessFooList 中的 SaveChanges 正在删除它不打算删除的内容。我在这里认真地抓住稻草,因为除了发誓他永远不会从桌子上删除东西的人之外,我已经没有其他选择了。
  • 您希望我们对您显示的代码发表评论吗?除非一个类实现了 Disposable,否则它不关心using。您的 Foo 列表在 ProcessFooStuff 和 GetFoo 的函数范围内声明。所以,你可以退货。然后它作为参数传递给 ProcessFooList,因此它不符合收集条件。调试时你看到了什么?

标签: c# scope using


【解决方案1】:

Using 只清理 using 语句中的项目。 dbContext 将在两个函数中被 Disposed 调用。

这段代码看起来像是为了删除 foos 而设计的,它使用两个单独的数据库上下文来执行此操作,但它获取 foos 列表,删除它们,然后将其更改保存到数据库中。

【讨论】:

    【解决方案2】:

    一旦完成,dispose 方法将始终释放 dbcontext。 using 只是 try finally 块的语法糖,它为 using 中的一次性对象运行 dispose。

    请尝试发布您的流程方法代码,问题可能出在哪里

    祝你好运

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多