【问题标题】:Derived entity types in WCF Data Services and ODataWCF 数据服务和 OData 中的派生实体类型
【发布时间】:2012-08-10 20:24:42
【问题描述】:

我第一次检查 WCF 数据服务和 OData,我想知道在实体模型中使用继承是否是不好的做法?好像支持的不是很好。

例如,我遇到了 OData 问题,我想过滤派生类型的属性。但似乎只能根据基类型属性进行过滤?

这失败了: http://[localhost]:8080/Entities?$filter=startswith(Text,'bla')

无论如何,创建非派生实体类型并具有接口以“协调”不同实体类型中的属性是否更好?

例如:

EntityBase -> Id, ParentId

笔记本:EntityBase -> 标题

注意:EntityBase -> 文本

IEntity -> Id, ParentId

笔记本:IEntity -> Id、ParentId、标题

注意:IEntity -> Id、ParentId、文本


为什么 5.1.0-rc1 仍然不支持 $format-tag?

【问题讨论】:

    标签: .net wcf wcf-data-services odata


    【解决方案1】:

    $format 将很快得到支持。由于意识形态原因和有简单的解决方法,这一直是较低的优先级。在那之前你可以使用JSONP attribute Pablo 的博客。无论如何,在接下来的几个月中,您应该会看到我们的堆栈支持 URL 中的 $format。

    至于派生类型,据我所知,大多数操作应该正常工作。要过滤派生类型的属性,您需要先转换为该类型。例如,在我的 Scratch 服务中,我有以下类:

    namespace Scratch.Web
    {
        public abstract class Product
        {
            public int ID { get; set; }
            public string Name { get; set; }
            public Product RelatedProduct { get; set; }
        }
    
        public class DiscountedProduct : Product
        {
            public double Discount { get; set; }
            public ICollection<Category> Categories { get; set; }
        }
    
        // ...
    }
    

    这使我能够发出如下查询(这将获得折扣大于 10 的所有打折产品):

    http://localhost:59803/ScratchService.svc/Products/Scratch.Web.DiscountedProduct?$filter=Discount gt 10.0
    

    在 URL 中,注意转换为我要过滤的类型(使用完全限定的实体类型名称)。

    【讨论】:

    • 我也刚刚注意到 LightSwitch 似乎不支持域模型中的继承,所以我不建议任何人在他们的模型中使用继承:connect.microsoft.com/VisualStudio/feedback/details/749933/…
    • 如果您的客户是 LightSwitch,那可能是真的。如果您的客户端将是 WCF 数据服务、data.js、ODataLib 或简单的 JavaScript,我认为您可以使用继承。
    • 为了在数据服务中使用继承,我必须升级到最新版本的库。我正在使用客户端库的 5.4 版 (NuGet),我可以确认继承确实适用于该版本。
    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多