对象中的变量不会更新,除非我在调试期间检查变量

本文关键字:变量 非我 调试 检查 更新 对象 | 更新日期: 2023-09-27 18:07:54

我目前正在三个独立的MVC项目中工作,并且只在其中一个反复遇到此问题。我似乎无法确切地确定为什么会发生这种情况。我发现的所有相关问题似乎都与使用随机数生成器或其他无关的问题有关。

无论如何,这是我目前遇到麻烦的代码。

    public void RemoveLotFromDocument(int documentId)
    {
        Document documentWithLotToDelete = _context.Documents.FirstOrDefault(x => x.Id == documentId);
        try
        {
            documentWithLotToDelete.LotNumber = null;
        }
        catch
        {
            throw new Exception();
        }
        _context.SaveChanges();
    }

特别是try语句中的行。该变量不会被设置为null,除非我是:

  • 逐行执行代码
  • 通过展开对象属性来检查Visual Studio中的变量

例如,如果我正在调试,在代码中插入一个断点,逐步执行try语句,并在_context展开/检查对象。SaveChanges documentWithLotToDelete。LotNumber不变。否则,代码将按预期工作,将对象设置为null,然后允许我删除对象(否则我会得到预期的delete语句与REFERENCE约束冲突)。

我读到的另一个问题是,可能有一个异常被抑制了,因此try和catch语句没有捕捉到任何有趣的事情。

关于为什么会发生这种情况,或者我可以看到这个项目与其他没有这种效果的项目有什么不同?

对象中的变量不会更新,除非我在调试期间检查变量

否则我得到预期的DELETE语句与REFERENCE约束冲突

因此,您在字里行间给出了LotNumber是引用属性的基本信息,而不是原始类型(如string)。

如果您将null分配给非空的string属性,更改跟踪器将注意到此更改,EF将保存更改。

但是这个引用属性documentWithLotToDelete.LotNumber = null;的赋值不会改变任何东西。此时的值是null,并且保持为空。没有变化。如果在调试时达到峰值,则会触发延迟加载。接下来会发生什么取决于您执行此操作的时刻:

  • 在加载赋值:documentWithLotToDelete.LotNumber之前,将赋值设置为null,检测到变化并保存
  • 赋值后:再次加载documentWithLotToDelete.LotNumber,但现在它不再改变了。

补救措施是确保LotNumber总是加载之前,你(认为你)修改它:

vardocumentWithLotToDelete = _context.Documents
                                     .Include(d => d.LotNumber)
                                     .FirstOrDefault(x => x.Id == documentId);
相关文章: