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

时间:2018-10-15 05:33:10

标签: asp.net-core .net-core entity-framework-core ef-core-2.1

我一直试图使用.NET Core 2.1构建具有阶段性Web内容更改功能的CMS,因此,我的系统体系结构中有三个站点:

  1. CMS站点-用户可以通过CMS提出对网站内容的更改,更改将在获得管理员批准后推送到暂存/生产站点。
  2. 登台前端-用于内部UAT的前端网站,显示所有已批准/未批准的网站内容。
  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 Docs,但是找不到正确的方法。我可以帮您这个家伙吗?谢谢

1 个答案:

答案 0 :(得分:0)

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

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

时EF Core没有什么可跟踪的

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

如果您只想加载所有内容,可以看看Entity Framework Core 2.0.1 Eager Loading on all nested related entities