我一直在尝试使用 .NET Core 2.1 构建一个 CMS,该 CMS 具有暂存 Web 内容更改的功能,因此我的系统架构中有三个站点:
- CMS 站点 - 用户可以通过 CMS 对 Web 内容提出更改建议,更改将在管理员批准后推送到暂存/生产站点。
- 暂存前端 - 用于内部 UAT 目的的前端 Web 显示所有已批准/未批准的 Web 内容。
- 生产前端 - 面向公众的前端 Web 仅显示批准的 Web 内容。
我注入了三个DbContext
实例来实现上述目标:
CmsContext
- 存储用户建议的第一轮 Web 内容更改。StagingContext
- 暂存 Web 前端读取 Web 内容的位置ProductionContext
- 生产 Web 前端读取 Web 内容的位置
我遇到的问题是,当我尝试执行以下操作(启用延迟加载(时:
var entity = await stagingContext.FindAsync(entityType, entityId);
productionContext.Update(entity);
await productionContext.SaveChangesAsync();
导航属性没有像我预期的那样更新。
我也尝试了ChangeTracker.TrachGraph
方法,但它不会循环访问导航属性。
我知道原因可能是,即使启用了延迟加载,导航属性以前也从未被访问过,因此它们不会填充productionContext
更新的值。
在发布此问题之前,我已经通读了Microsoft文档,但无法找出正确的方法。我可以得到你们的帮助吗?谢谢
您说您使用延迟加载,但以前从未访问过属性,因此我认为您必须急于用Include
加载它们。
您必须将FindAsync
调用替换为Include
以预先加载所需的所有导航属性,然后使用SingleOrDefaultAsync
或SingleAsync
。由于属性是延迟加载的,因此永远不会加载它们,因为你从不访问它们,并且 EF Core 在调用productionContext.Update(entity);
时没有任何要跟踪的内容
我不认为调用Update
可以访问任何属性以使延迟加载工作,它只是设置EntityState
.我不确定打电话给SaveChangesAsync
是否会改变这一点。但是,如果它不起作用,那么它可能没有延迟加载。
如果您只想预先加载所有内容,可以查看所有嵌套相关实体上的实体框架核心 2.0.1 预先加载