Asp.net web api 使用ApicController与odata EntitySetController

Asp.net web api 使用ApicController与odata EntitySetController,asp.net-web-api,odata,Asp.net Web Api,Odata,我刚开始学习ASP.NET Web API,但有几件事我还不清楚: 为什么我应该使用EntitySetController,它继承自odata控制器而不是ApicController 为什么在OData的上下文中经常提到EF。我知道它“代表”一个实体,但我不明白为什么这两个实体是连接在一起的。第一个是服务层,EF是模型 我已经阅读并理解了很多关于这个主题的文学作品,是的,我错过了最佳实践 非常感谢, David如果要创建OData端点,请使用EntitySetController。如果希望返

我刚开始学习ASP.NET Web API,但有几件事我还不清楚:

  • 为什么我应该使用EntitySetController,它继承自odata控制器而不是ApicController
  • 为什么在OData的上下文中经常提到EF。我知道它“代表”一个实体,但我不明白为什么这两个实体是连接在一起的。第一个是服务层,EF是模型
  • 我已经阅读并理解了很多关于这个主题的文学作品,是的,我错过了最佳实践
非常感谢,
David

如果要创建OData端点,请使用EntitySetController。如果希望返回通用JSON或XML或其他格式(例如,使用自定义格式化程序),请使用ApicController

在Web API中,EF和OData不一定连接。您可以编写不使用EF的OData端点。很多Web API教程都使用EF,因为EF代码优先在教程中相对容易显示。:-)

为什么我应该使用EntitySetController,它继承自odata控制器而不是ApicController

  • 我同意这是令人困惑的,而且似乎缺少文档(至少当我和你有同样的问题时)。我放松心情的方式就是简单地阅读。我鼓励您也这样做,因为它确实很短(集中于EntitySetController类及其应用程序);最多不应超过5-10分钟(承诺),之后您将不会有任何问题

    简短的故事是,它消除了一些常见案例的样板文件(但如果你想要更多的上下文和观点,请继续阅读)

为什么在OData的上下文中经常提到EF。我知道它“代表”一个实体,但我不明白为什么这两个实体是连接在一起的。第一个是服务层,EF是模型

  • 这一点也让我困惑不已,直到我放弃并研究了OData的起源(以前是ADO.NET数据服务)和(暗示OData核心协议版本仍然使用名为“DataServicesVersion”的头指定)。在那里,您可以发现OData使用实体数据模型,该模型与EF使用的模型规范相同,并以与EF(概念模式定义语言)相同的格式对其进行序列化。这不是巧合,WCF数据服务对EF有着主要的支持,尽管它不需要EF,但可以说它的设计是基于EF的

    请注意,WCF数据服务仍然是OData的旗舰实现

可能引起高度兴趣的事情(至少对我来说是这样):当将EF与ASP.NET Web API和OData扩展一起使用时,就我所知,没有办法在两者之间共享模型

如果你觉得这不有趣,你可以跳到下一个要点来获得下一个答案

例如,当在“代码优先”设置中使用EF时,通常会主要基于代码约定和EF(“流体API”)构建模型。然后,您将使用将做几乎完全相同的事情来构建OData模型,并得到几乎完全相同的结果。在过去,我设法从EF团队或Web API团队的一次随机会议上找到了一些随机笔记,他们简要地提到了这一点,就我所记得的(我再也找不到这个文档了),没有计划改善这种情况。因此,他们现在有两种不同且不兼容的EDM实现

我承认我没有花时间仔细检查代码以正确验证这一点,但我知道WebAPI+OData扩展依赖于(它最初是为WCF数据服务开发的),而EF不依赖,而是使用自己的实现。我还知道他们基于约定的模型构建器是不同的,如上所述。当你在DB第一次设置中使用EF时,它会变得很可笑;您可以在中获得CSDL格式的序列化EDM模型,OData扩展继续并在运行时从EF通过T4模板从初始CSDL生成的CLR代码(使用单独的代码约定)本身生成自己的序列化CSDL代码。你的脑袋经常打转吗


更新:这是不到两周前(7月19日),很抱歉我错过了。(感谢RaghuRam Nadiminti。)我没有查看修补程序,但从示例代码来看,它的工作方式似乎是必须使用EF EDMX序列化程序将模型序列化为CSDL,然后使用EdmLib解析器将其反序列化,以供OData扩展使用。它仍然感觉有点像EF代码优先设置中的黑客(至少CLR代码只分析一次,但我更希望这两个组件一开始使用相同的内存模型)。但是,当使用模型优先或数据库优先方案时,可以通过直接反序列化VS生成的EDMX文件来实现快捷方式。在最后一个场景中,它实际上感觉不太像黑客,但同样,单一模型最好。我不知道EF是否可能会转而使用EdmLib,或者EdmLib是否会转而使用EF的EDM模型,这两个项目现在都非常强大,阻碍因素可能不仅仅是技术问题。不幸的是,ASP.NET团队目前对此无能为力



更新:再次偶然发现。他们确实来自EF团队,并表示他们不打算使用EdmLib


然而,我现在相信这都是一件好事。原因是,如果他们填补了所有的空白,删除了所有的样板文件,并使一切正常,那么他们最终将进入WCF数据服务的位置,这是一个完全集成的解决方案,程序员通过“拦截器”在管道中注入代码。对我来说,去那里的唯一原因是因为开源的要求,但即使如此,我认为尝试和提倡一个