当我的应用程序请求删除实体时,我想删除与该实体关联的上传文件。所以我有以下代码:
TestRequest req = _context.TestRequests
.Where(x => x.id == id)
.Include(x => x.TestRequestRuns)
.Include(x => x.TestPlanFile)
.Single();
_context.TestRequests.Remove(req);
_context.UploadedFiles.Remove(req.TestPlanFile);
_context.SaveChanges();
关于删除上传文件的此代码例外。调试显示调用_context.TestRequests.Remove(req)
使req.TestPlanFile
属性null
,从而导致异常(您无法删除空上载文件)。这不会清除req.TestPlanFileId
属性。
为了执行此删除,您必须在标记要删除的主要实体之前标记要删除的子实体。这也意味着标记要删除的项目必须是您对该实体数据执行的最后一项操作,因为您不会(至少很容易)能够访问子实体以进行进一步操作(不是总是会删除子实体,例如,如果多个测试计划使用了上传的文件。)
有没有人有任何理由说明在使用SaveChanges()
之前剥离属性的原因是什么?我原以为Remove()
唯一的功能就是告诉EF它需要在保存更改时删除该行,但显然它正在做更多的事情。