>为什么我应该使用EntitySetController,它继承自odata控制器而不是ApiController
为什么EF在OData的上下文中经常被提及。我知道它是“代表”一个实体,但我不明白为什么2是连接的。第一个是服务层,EF是Model。
>我已经阅读并理解了很多关于该主题的文献,是的,我错过了最佳实践
非常感谢,
大卫
解决方法
why should I use EntitySetController,which inherits from odata controller instead of ApiController
>我同意这是令人困惑的,文件似乎缺乏(至少当我有同样的问题)。我的感觉放松的方式是简单地阅读the code.我鼓励你做同样的事情,因为它真的很短(专注于EntitySetController类及其helpers);不应该超过5-10分钟的上限(承诺),你不会有任何问题。
简短的故事是,它消除了常见情况的一些样板(但如果您想要更多的语境和意见,请继续阅读)。
Why is EF frequently mentioned in the context of OData. I know it “represents” an Entity,but I don’t see why the 2 are connected. The first is on Service Layer and EF is Model.
>这个我也一直困惑我,直到我放弃了,看看OData的起源,WCF Data Services(以前的ADO.NET数据服务)和OData specifications(提示是,OData Core协议版本仍然用一个名为“ DataServicesVersion“)。您可以在此找到OData使用EDM实体数据模型,该模型与EF使用的模型规范相同,并以与EF:CSDL(概念模式定义语言)相同的格式将其序列化。这不是巧合,WCF数据服务对EF有很大的支持,虽然它不需要它,可以说它的设计是基于它的。
请注意,WCF数据服务仍然是OData的旗舰实现。
有可能是高兴的东西(至少对我来说):当使用EF与ASP.NET Web API和OData扩展时,没有办法(据我所知)在两者之间共享模型。
如果没有找到这个有趣的话,你可以跳到下一个回答的下一个回答。
例如,在Code-First设置中使用EF时,通常会根据代码约定和EF System.Data.Entity.DbModelBuilder(“流体API”)构建您的模型。然后,您将使用将完成相同的事情构建OData模型的System.Web.Http.OData.Builder.ODataConventionModelBuilder,并且几乎完全相同的结果。在过去,我从一个随机的会议中,从EF小组或Web API团队中抽出了一些随机的笔记,这个简短的提到了这一点,据我所知,我再也找不到这个文件了没有改善情况的计划。因此,它们现在具有两种不同的和不相容的EDM实现。
我承认我没有花时间仔细检查代码以正确验证,但我知道Web API OData扩展依赖于EdmLib(它提供了最初为WCF数据服务开发的Microsoft.Data.Edm),而EF不是使用自己的System.Data.Entity.Edm实现。我也知道,他们的基于会议的模型建设者是不同的,如上所述。当您在DB-First设置中使用EF时,它变得可笑您可以在EDMX file中获得CSDL格式的序列化EDM模型,并且OData扩展在运行时从CLR代码(使用单独的代码约定)自身生成自己的序列化CSDL代码(通过T4模板从初始CSDL生成的本身)。你的头旋很多?
更新:这是largely improved在两个星期前(7月19日)有一点,对不起,我错过了。 (感谢RaghuRam Nadiminti。)我没有评论补丁,但是从示例代码来看,似乎它的工作方式是使用EF EDMX序列化器将模型序列化为CSDL,然后使用EdmLib解析器反序列化它由OData扩展使用。它仍然感觉有点像EF Code-First设置中的一个黑客(至少CLR代码只被分析一次,但是如果两个组件都使用相同的内存模型,我宁愿使用它)。但是,通过使用Model-First或Database-First方案,可以直接对VS生成的EDMX文件进行反序列化,可以使用快捷方式。在最后的这种情况下,它实际上并不像一个黑客,而是一个单一的模型将是最好的。我不知道EF可能会转而使用EdmLib,或者EdmLib会切换到使用EF的EDM模型,这两个项目现在都很强大,而且阻塞者可能不仅仅是技术问题。不幸的是,ASP.NET团队对于AFAICT不太了解。
更新:再次those meeting notes偶然发现。他们确实来自EF团队,并表示他们不打算在EdmLib上工作。
但是,我现在相信这是一件好事。原因是如果他们关闭所有的差距,并删除所有的样板,并使所有的正确的,它们将基本上结束WCF数据服务是哪里,这是一个完全集成的解决方案,程序员通过“拦截器“。对我来说,唯一的原因是因为开放源代码的要求,但即使如此,我认为尝试和倡导开源的WCF-DS更为合理。
现在的问题就是:“但是呢,那么Web API的OData扩展有什么好处呢?”那么,当您真正想要为数据存储和Web服务使用两种不同的型号时,这是一个很好的配合。当“拦截器”设计不够灵活,您可以在两个模型之间进行翻译时,这是一个很好的配合。
更新:截至2014年3月27日,它是官方的,他们将试图弥补这些差距,deprecating WCF Data Services in the process.很早期的谈话提到了一个“处理程序”来做到这一点,很可能是一个ASP.NET HTTP处理程序(见公告的评论) 。看起来很少有规划,因为他们仍然集思广益的想法,使ASP.NET Web API填补了WCF数据服务的用例。我在上面提到这些用例,在公告和this thread(在公告前几天开始)发表评论。
许多其他人表达了同样的关切(再次,看到相关的讨论),所以很高兴看到我没有一直在做梦。
有一些令人怀疑的是,ASP.NET Web API可以在合理的时间内变成有用的数据服务用例,所以有些人suggested that MSFT reconsider their decision.是否使用ASP.NET开源要求的问题也是一个难题: WCF数据服务即将开放,如果一切都“好”,尽管不是因为任何倡导努力。 (这只是一个源代码转储,不知道有人会在这个时候保持它)。
从我可以收集到的东西,一切都指向预算削减,有些人谈论这是公司范围“重新聚焦”的结果,尽管这一切都应该用一粒盐。
除此之外,现在有一种可能性,随着时间的推移,出现了一个新的解决方案 – 更好的WCF数据服务或Web API在OData API方面。虽然现在看起来有点混乱,但是MSTA OData团队相对较早地从客户那里获得了相当多的反馈意见,所以有希望(特别是如果将来的解决方案本身就是开放源代码的话)。过渡可能会很痛苦,但请务必在将来观看这个讨论。
我不知道我会花些时间来更新这个帖子了吗我只是想强调,关于Web API和数据服务的事情即将发生很大变化,因为这个答案还在不断被高涨。
更新:RESTier(announcement)似乎是结果。
最后,我的(个人)意见:OData尽管在技术上是基于REST的HTTP协议,但非常非常非常数据导向。这是非常好的(我们可以使用HTTP定义很多不同类型的接口),我可以找到所有ServiceStack与OData的辩论无关(我相信它们在当前的常见架构中的不同层次上运行)。令人担忧的是,试图使基于OData的API的行为就像一个以行为为中心(或“面向过程”或“ServiceStack”)的API。对我来说,OData URI惯例和资源表示格式(Atom和JSON)一起替代sql,WCF Data Services “Query Interceptors” and “Change Interceptors”替换DBMS触发器和OData Actions替换DBMS存储过程。有了这个观点,您可以立即看到,如果需要将您的OData API放在背后的域逻辑太复杂或数据不是非常重要,那么您最终将会遇到不尊重REST原则的复杂的“操作”不觉得正确的实体。如果将OData API视为纯数据层,那就行了。您可以在其上堆叠一个服务,就像将“服务层”放在sql数据库之上一样。
因此,我不确定Web API OData扩展是如此之大。如果您需要根本不同的模型,那么您的应用程序很可能不是面向数据的(除非您简单地从各种来源或某些方面合并模型),否则OData并不适合。这是一个迹象,您至少应该考虑Web API(与sql或OData在一起)或类似ServiceStack。
为了更好或更坏,Javascript客户端不能与远程服务器通话sql。也许在未来通过浏览器API,或者可能通过WebSockets的变体,但是现在,OData是与远程数据层最接近的任何人都将获得具有瘦或无服务器端逻辑的丰富的JS客户端。 OData当然是由其他类型的客户端使用的,但我会说,它在客户端的Web平台上特别有用,像Breeze.js或者JayData这样的东西就是OData实体框架是sql。
I have read and understood a lot of litereture written about the subject,yes I missed when its the best practice
>别担心,我环顾四周,但我不认为有人真的知道他们在做什么。只要假装像其他人一样,你就意识到这个混乱。