首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以从WCF数据服务延迟加载复杂类型?

是否可以从WCF数据服务延迟加载复杂类型?
EN

Stack Overflow用户
提问于 2013-09-25 11:43:10
回答 1查看 1.2K关注 0票数 1

我有DbContext子类

代码语言:javascript
复制
ReportingContext : DbContext

当我做简单的CRUD时,我创建了一个WCF数据服务来公开我的DbSet.

代码语言:javascript
复制
public class ReportService : DataService<ReportingContext>

我已经能够直接使用ReportingContext进行“表拆分”。基本上使用两个实体(ReportLayout和ReportLayoutData),它们都使用一个表。我能够使用fluent API对其进行配置。在单元测试中,一切都很好,因为我能够返回ReportLayouts,并且只在被访问时加载ReportLayoutData。

当我试图通过DataServiceContext,OData版本5.6 -使用DataServiceContext类来实现这一点时,我的问题就开始了。返回ReportLayouts很好,但是尝试延迟加载依赖的数据到目前为止还不可能。我尝试过不同的东西:

  • 当我直接调试服务并检查生成的SQL-2单独查询(如单元测试)时,通过服务方法调用Include实际上是有效的。但是,在浏览器中查看时,服务根本没有在返回的属性中包含ReportLayoutData属性,而且我收到了与缺少的属性相关的客户端错误。 返回CurrentDataSource.Reports.Include("LayoutData").Where(x ints.Contains(x.ReportLayoutID)).AsQueryable();}私有静态int[] GetInts(string ids) {返回ids.Split(",".ToCharArray()).Select(x => Convert.ToInt32(X)).ToArray()};
  • 我试着使用DataServiceContext.Expand - $expand --但是当我尝试不同的参数时,它失败了。
  • 我试着打电话给执行,各种各样的问题
  • 我将ReportLayoutData属性转换为IQueryable,尽管它是1-1关系,现在它说,在运行以前工作良好的EF特定单元测试时,ReportLayoutData不是ReportLayout的属性。

我的问题是:是否可以以这种方式通过WCF数据服务进行延迟加载,还是应该公开2个集合并将结果解析为客户机上的单个对象?如果可能的话,我只想看到基本的模式--几个相关的实体、fluent API声明和DataService代码。谢谢你的帮助。

编辑

我目前正被错误所困扰:

--一种在“ReportLayout”类型上命名为“LayoutData”的属性,有一种“结构”,但它应该是“导航”。

尽管在浏览器中检索数据没有问题: ReportService.svc/Reports()?$expand=LayoutData

部分堆栈跟踪:

Microsoft.Data.OData.ReaderValidationUtils.ValidateNavigationPropertyDefined(String propertyName,IEdmEntityType owningEntityType,ODataMessageReaderSettings messageReaderSettings) at Microsoft.Data.OData.Atom.ODataAtomEntryAndFeedDeserializer.TryReadNavigationLinkInEntry(IODataAtomReaderEntryState entryState,String linkRelation,String linkHRef)

通过不通过服务公开2 dbSets,我能够删除上述错误。会考虑一个服务操作,从EF返回我需要的东西,可惜它不那么优雅。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-30 15:02:06

最后,我的解决方案是拆分表,以便创建一个以ICollection形式公开的导航属性。

因此,我能够实现诸如Reports/ReportService.svc/Reports(1) $expand=LayoutData (AddQueryOption("$expand","LayoutData")之类的查询,并编写了一个服务方法来对多个实例执行此操作。

代码语言:javascript
复制
    [WebGet]
    public IQueryable<ReportLayout> GetReportsByID(string ids)

我只通过服务公开了一个Dbset --孩子们不能直接访问。

可以使用DataServiceContext方法实现对依赖实体的客户端更新:

代码语言:javascript
复制
AddObject, AddLink
AttachTo, UpdateObject, AttachLink //UpdateObject on the child ensures the entity state changes to modified (see DataServiceContext.Entites collection).

回想起来,我可能不需要把桌子分开,但没有时间玩这个游戏。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19003971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档