1

考虑这段代码:

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代码,否则导航属性仍然​​是空的。

4

1 回答 1

0

在进行进一步研究之后,您似乎应该ProductDesignerEntities在每个使用上下文中创建一个新实例,所以这就是我将采用的解决方案。但是,我无法正确解决问题,这让我很烦恼!

我将把它写成一个非常奇怪的配置问题,或者 WCF 数据服务中的一个错误,因为根据 Fiddler 的说法,它确实执行了对附加数据的请求;它只是没有出现在返回的对象中。

于 2012-09-25T18:48:36.510 回答