我一直试图使用.NET Core 2.1构建具有阶段性Web内容更改功能的CMS,因此,我的系统体系结构中有三个站点:
为了实现上述目的,我注入了三个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 Docs,但是找不到正确的方法。我可以帮您这个家伙吗?谢谢
答案 0 :(得分:0)
您说您使用延迟加载,但是以前从未访问过属性,因此我认为您必须急于用Include
加载它们。
您必须将FindAsync
调用替换为Include
,以急切加载所需的所有导航属性,然后使用SingleOrDefaultAsync
或SingleAsync
。因为属性是延迟加载的,所以它们永远不会加载,因为您永远不会访问它们,并且在调用productionContext.Update(entity);
我不认为调用Update
可以访问任何属性来进行延迟加载,而只是设置EntityState
。我不确定对SaveChangesAsync
的调用是否会对此进行更改。但是,如果它不起作用,则可能是没有延迟加载。
如果您只想加载所有内容,可以看看Entity Framework Core 2.0.1 Eager Loading on all nested related entities