考虑这段代码:
var svc = new ProductDesignerEntities(AppSettings.ProductDesignerServiceLocation);
var scenariox = svc.Scenarios
.Where(o => o.ID == id)
.FirstOrDefault();
var scenario = svc.Scenarios
.Expand(o => o.SomeNavigationProperty)
.Where(o => o.ID == id)
.FirstOrDefault();
当此代码运行时,scenario.SomeNavigationProperty
将不填充。注释掉填充的代码可以scenariox
修复它。为什么是这样?是否可以通过配置服务上下文或数据服务来解决这个问题,或者我是否必须以某种方式更改我的代码设计?
我能想到的替代方案在某些能力上都逊色:
- 每个操作创建一个
ProductDesignerEntities
实例。这几乎完全杀死了请求内缓存。 - 每个控制器创建一个
ProductDesignerEntities
实例。基本控制器类不那么烦人,但这会杀死控制器之间的缓存,并且如果同一控制器中的不同操作需要来自同一个表的不同导航属性集,则不会解决问题。 - 如果该属性为空,则手动填充该属性。难以始终如一地实施这样的手动解决方案;必然成为bug的来源。
- 始终手动填充属性。有点违背导航属性的目的。
- 确保请求中对表的所有使用都具有相同的 .Expand() 列表。非常烦人和乞求难以修复的错误。
我开始倾向于第一种选择。尽管每个实例都有新连接的额外开销,但它似乎问题最少:/
编辑:我设法让服务查询通过 Fiddler 运行,它们看起来是正确的。但是scenario
除非我注释掉scenariox
代码,否则导航属性仍然是空的。