具有嵌套操作的MVC,具有EF5的WCF数据服务和DataServiceQuery<> .Expand()

时间:2012-09-24 19:59:19

标签: c# asp.net-mvc entity-framework wcf-data-services

考虑以下代码:

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实例。使用基本控制器类不那么烦人,但这会导致控制器之间的缓存失效,并且如果同一控制器中的不同操作需要来自同一个表的不同导航属性集,则无法解决问题。
  • 如果属性为空,则手动填充该属性。难以始终如一地实施这样的手动解决方案;必然会成为错误的来源。
  • 始终手动填充该属性。有点失败导航属性的目的。
  • 确保请求中表的所有使用都具有相同的.Expand()列表。非常烦人,并乞求难以修复的错误。

我开始倾向于第一种选择。尽管每个实例的新连接都有额外的开销,但似乎问题最少:/

编辑:我设法让服务查询通过Fiddler运行,看起来是正确的。但是scenario上的导航属性仍然​​空白,除非我注释掉scenariox代码。

1 个答案:

答案 0 :(得分:0)

进行进一步的研究之后,似乎你应该在每个使用环境中创建一个新的ProductDesignerEntities实例,这样我就可以使用它。尽管如此,我仍然无法正确解决问题,这让我很烦恼!

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