如何在 EF Core 中保存另一个 DbContext 的相关数据?
How to save related data from another DbContext in EF Core?
我一直在尝试使用 .NET Core 2.1 构建一个 CMS,该 CMS 具有暂存 Web 内容更改的功能,因此我的系统架构中有三个站点:
- CMS 站点 - 用户可以通过 CMS 提出对 Web 内容的更改,更改将在管理员批准后推送到 Staging/Production 站点。
- Staging Frontend - 用于内部 UAT 目的的前端 Web,显示所有 approved/unapproved Web 内容。
- 生产前端 - 面向 public 的前端 Web 仅显示批准的 Web 内容。
我注入了三个 DbContext
实例来实现上述目标:
CmsContext
- 存储用户提议的第一轮网络内容更改。
StagingContext
- 暂存网络前端读取网络内容的地方
ProductionContext
- 生产网络前端读取网络内容的地方
我遇到的问题是,当我尝试执行以下操作(启用延迟加载)时:
var entity = await stagingContext.FindAsync(entityType, entityId);
productionContext.Update(entity);
await productionContext.SaveChangesAsync();
导航属性没有像我预期的那样更新。
我也尝试过 ChangeTracker.TrachGraph
方法,但它不会遍历导航属性。
我知道原因可能是,即使启用了延迟加载,导航属性之前从未访问过,所以它们没有填充 productionContext
的值来更新。
在 post 这个问题之前,我已经通读了 Microsoft 文档,但无法找到正确的方法。我可以请你帮帮这些家伙吗?谢谢
您说您使用了延迟加载,但之前从未访问过属性,所以我认为您必须使用 Include
来预先加载它们。
您必须将 FindAsync
调用替换为 Include
以预先加载您需要的所有导航属性,然后使用 SingleOrDefaultAsync
或 SingleAsync
。因为属性是延迟加载的,所以它们永远不会加载,因为您永远不会访问它们,并且当您调用 productionContext.Update(entity);
时,EF Core 没有任何可跟踪的内容
我认为调用 Update
不会访问延迟加载的任何属性,它只是设置 EntityState
。我不确定调用 SaveChangesAsync
是否会改变它。但是,如果它不起作用,则可能是它没有延迟加载。
如果你只想预先加载所有内容,你可以看看
我一直在尝试使用 .NET Core 2.1 构建一个 CMS,该 CMS 具有暂存 Web 内容更改的功能,因此我的系统架构中有三个站点:
- CMS 站点 - 用户可以通过 CMS 提出对 Web 内容的更改,更改将在管理员批准后推送到 Staging/Production 站点。
- Staging Frontend - 用于内部 UAT 目的的前端 Web,显示所有 approved/unapproved Web 内容。
- 生产前端 - 面向 public 的前端 Web 仅显示批准的 Web 内容。
我注入了三个 DbContext
实例来实现上述目标:
CmsContext
- 存储用户提议的第一轮网络内容更改。StagingContext
- 暂存网络前端读取网络内容的地方ProductionContext
- 生产网络前端读取网络内容的地方
我遇到的问题是,当我尝试执行以下操作(启用延迟加载)时:
var entity = await stagingContext.FindAsync(entityType, entityId);
productionContext.Update(entity);
await productionContext.SaveChangesAsync();
导航属性没有像我预期的那样更新。
我也尝试过 ChangeTracker.TrachGraph
方法,但它不会遍历导航属性。
我知道原因可能是,即使启用了延迟加载,导航属性之前从未访问过,所以它们没有填充 productionContext
的值来更新。
在 post 这个问题之前,我已经通读了 Microsoft 文档,但无法找到正确的方法。我可以请你帮帮这些家伙吗?谢谢
您说您使用了延迟加载,但之前从未访问过属性,所以我认为您必须使用 Include
来预先加载它们。
您必须将 FindAsync
调用替换为 Include
以预先加载您需要的所有导航属性,然后使用 SingleOrDefaultAsync
或 SingleAsync
。因为属性是延迟加载的,所以它们永远不会加载,因为您永远不会访问它们,并且当您调用 productionContext.Update(entity);
我认为调用 Update
不会访问延迟加载的任何属性,它只是设置 EntityState
。我不确定调用 SaveChangesAsync
是否会改变它。但是,如果它不起作用,则可能是它没有延迟加载。
如果你只想预先加载所有内容,你可以看看