我目前在我的工作中处理三个独立的MVC项目,并且只在三个中的一个中反复遇到这个问题。我似乎无法准确地确定它为什么会发生。我发现的所有相关问题似乎都涉及使用随机数生成器或不相关的东西。
Anywho,这是我目前遇到问题的代码。
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例如,如果我正在调试,请在代码中插入断点,逐步执行try语句,然后在_context.SaveChanges中展开/检查对象,documentWithLotToDelete.LotNumber保持不变。否则代码按照预期工作,将对象设置为null,然后允许我删除对象(否则我得到预期的DELETE语句与REFERENCE约束冲突)。
我读到的另一个问题是,可能有一个异常被某种方式压制,因此try和catch语句并没有发现任何有趣的事情。
关于为什么会发生这种情况或者我能看到什么的任何想法可能会与我的其他人产生不同的影响?
答案 0 :(得分:1)
否则我得到预期的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);