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

How to save related data from another DbContext in EF Core?

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

  1. CMS 站点 - 用户可以通过 CMS 提出对 Web 内容的更改,更改将在管理员批准后推送到 Staging/Production 站点。
  2. Staging Frontend - 用于内部 UAT 目的的前端 Web,显示所有 approved/unapproved Web 内容。
  3. 生产前端 - 面向 public 的前端 Web 仅显示批准的 Web 内容。

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

  1. CmsContext - 存储用户提议的第一轮网络内容更改。
  2. StagingContext - 暂存网络前端读取网络内容的地方
  3. ProductionContext - 生产网络前端读取网络内容的地方

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

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

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

我也尝试过 ChangeTracker.TrachGraph 方法,但它不会遍历导航属性。

我知道原因可能是,即使启用了延迟加载,导航属性之前从未访问过,所以它们没有填充 productionContext 的值来更新。

在 post 这个问题之前,我已经通读了 Microsoft 文档,但无法找到正确的方法。我可以请你帮帮这些家伙吗?谢谢

您说您使用了延迟加载,但之前从未访问过属性,所以我认为您必须使用 Include 来预先加载它们。

您必须将 FindAsync 调用替换为 Include 以预先加载您需要的所有导航属性,然后使用 SingleOrDefaultAsyncSingleAsync。因为属性是延迟加载的,所以它们永远不会加载,因为您永远不会访问它们,并且当您调用 productionContext.Update(entity);

时,EF Core 没有任何可跟踪的内容

我认为调用 Update 不会访问延迟加载的任何属性,它只是设置 EntityState。我不确定调用 SaveChangesAsync 是否会改变它。但是,如果它不起作用,则可能是它没有延迟加载。

如果你只想预先加载所有内容,你可以看看