如何在 EF Core 中保存来自另一个 DbContext 的相关数据?



我一直在尝试使用 .NET Core 2.1 构建一个 CMS,该 CMS 具有暂存 Web 内容更改的功能,因此我的系统架构中有三个站点:

  1. CMS 站点 - 用户可以通过 CMS 对 Web 内容提出更改建议,更改将在管理员批准后推送到暂存/生产站点。
  2. 暂存前端 - 用于内部 UAT 目的的前端 Web 显示所有已批准/未批准的 Web 内容。
  3. 生产前端 - 面向公众的前端 Web 仅显示批准的 Web 内容。

我注入了三个DbContext实例来实现上述目标:

  1. CmsContext- 存储用户建议的第一轮 Web 内容更改。
  2. StagingContext- 暂存 Web 前端读取 Web 内容的位置
  3. ProductionContext- 生产 Web 前端读取 Web 内容的位置

我遇到的问题是,当我尝试执行以下操作(启用延迟加载(时:

var entity = await stagingContext.FindAsync(entityType, entityId);
productionContext.Update(entity);
await productionContext.SaveChangesAsync();

导航属性没有像我预期的那样更新。

我也尝试了ChangeTracker.TrachGraph方法,但它不会循环访问导航属性。

我知道原因可能是,即使启用了延迟加载,导航属性以前也从未被访问过,因此它们不会填充productionContext更新的值。

在发布此问题之前,我已经通读了Microsoft文档,但无法找出正确的方法。我可以得到你们的帮助吗?谢谢

您说您使用延迟加载,但以前从未访问过属性,因此我认为您必须急于用Include加载它们。

您必须将FindAsync调用替换为Include以预先加载所需的所有导航属性,然后使用SingleOrDefaultAsyncSingleAsync。由于属性是延迟加载的,因此永远不会加载它们,因为你从不访问它们,并且 EF Core 在调用productionContext.Update(entity);时没有任何要跟踪的内容

我不认为调用Update可以访问任何属性以使延迟加载工作,它只是设置EntityState.我不确定打电话给SaveChangesAsync是否会改变这一点。但是,如果它不起作用,那么它可能没有延迟加载。

如果您只想预先加载所有内容,可以查看所有嵌套相关实体上的实体框架核心 2.0.1 预先加载

相关内容

最新更新