如何使用WCF和OData暴露继承实体?

3
如果我有一个由WCF数据服务公开的OData继承层次结构,如何将子类实体公开为自己的实体集?我应该使用什么URI来访问它?
假设我有一个如下所示的OData URL:

http://myodataservice.svc

假设我有一个抽象实体foo和一个继承自foo的子类bar。
我想做的是访问URL http://myodataservice.svc/bar 来访问bar对象,但似乎这是不可能的。有人能给我指出一个简单的例子,以便我可以看到它是如何工作的吗?
1个回答

4
每个实体实例只能属于一个实体集。因此,您可以拥有多个共享相同类型(或基类型)的实体集,但它们的实体实例集必须不重叠。 如果您需要一个包含基类型所有实体实例的实体集,但仍然希望有时仅访问某个派生类型的实体实例,则可以使用类型转换路径段。
这需要OData V3,但然后您可以执行以下操作:

http://myodataservice.svc/baseentities/Namespace.DerivedType

这个URL就像是从baseentities实体集合中过滤出DerivedType实例的实体集合一样,但是它是强类型的(该URL的类型是DerivedType实例的集合)。因此,您可以像使用任何其他实体集合URL一样使用它,即您可以使用/进行进一步导航,或者附加任何查询运算符,如$filter、$select等。

1
我觉得我可能在这里漏了什么,我一直收到404资源无法找到的错误,尽管查询基本实体很好用; 人们通常会错过一步吗? - A Aiston
请确保服务器支持OData V3(如果您正在使用WCF数据服务,则必须启用它并且需要具有足够新的二进制文件等)。如果您确定您的服务器支持OData V3,请发布您要访问的URL和模型(EDM)的相关部分。 URL中的类型名称必须是来自您的模型的完全限定类型名称。 - Vitek Karas MSFT
感谢Vitek,我已将此作为单独的问题发布在http://stackoverflow.com/questions/16790088/wcf-data-service-gives-404-when-making-odata-requests-for-derived-types - A Aiston
1
你如何在 CreateQuery<>() 方法中使用这个技巧? - Saeed Neamati

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接