【问题标题】:How does an EF6 model and a WebAPI 2.2 + OData 4.0 model, relate?EF6 模型和 WebAPI 2.2 + OData 4.0 模型有什么关系?
【发布时间】:2015-01-30 07:50:44
【问题描述】:

我与 EF 和 OData 合作已有几年了。那时,WebAPI 上的 OData 仅限于一些 URL 过滤器,但即使是在 MVC 4 RTM 之前的最后一分钟也被取消了。

很多东西都变了。

现在我有一个带有 EDMX 文件的模型优先 EF6 项目,因为我喜欢直观地规划我的模型。我还在为这个应用程序构建一个 OData 服务,使用 WebAPI 2.2 和 OData 4.0。

下面的问题有评论:

“很遗憾,此时 EF 使用的 EDM 模型与 Web API OData 使用的 EDM 模型不同。”

OData exception The complex type 'WebTools.Order' refers to the entity type 'WebTools.Customer' through the property 'Customer'

这是可以理解的,分离最适合公共 API。

但是,我很困惑,因为网络上的快速入门教程(见下文)似乎对 OData 和数据库使用相同的 EF(代码优先)模型。

这是否意味着模型不再不同,上面的评论是旧的?或者这是否意味着如果我只想公开我的数据库模型,我必须先使用代码?

既然教程似乎展示了一个单一的 EF 数据库模型,那么如何分离并拥有两个模型呢?

我很难找到/信任在线资源,因为这些技术发展迅速。

卢克

【问题讨论】:

  • 我感觉代码优先已经赢了。我还发现解开 OData 和 EF 模型的想法是不切实际的,因为 IQueryable 接口必须直接通过 API 运行到 ORM/数据层。这消除了将 WebApi 用于 OData 的大部分好处,因为我只能有一个模型,所以我不妨先使用 EF 模型,然后让 WCF 数据服务将其全部打开到 Excel。

标签: asp.net-mvc entity-framework asp.net-web-api odata


【解决方案1】:

这是我到目前为止所学到的。

  • OData v4 不支持插入现有的模型优先 EDMX 模型类。

  • 它确实支持公开从 POCO 类构建的“任意”模型,实体之间的关系没有用如此强烈的术语表达,但 v4 模型更像是一个对象层次结构,甚至可以有一个根“节点” ' 并且所有子项和项集合都可以分支出来,一个图表。

  • 仅使用路由规则以及模型和控制器操作名称的一些简单约定,这一切都做得更加失败。

  • 因此可以围绕内存中的结构、no-sql 或由其他服务组成的 OData 服务。

  • 但是,当涉及到 SQL 源和 EF 时,必须将模型统一起来才能使 IQueryable 逻辑流动,而且还可以用于字段名称映射。

  • 由于 OData v4 模型构建器仅支持 POCO 类,因此您必须先执行代码。

  • 因此,带有 EF 的 OData v4 仅限于新建项目或那些认为 v4 中有足够的附加值以保证代码优先重建的项目。

  • 我正在研究基于现有数据库的代码优先自动 POCO 生成。这将允许 EDMX 生成 SQL 数据库,然后通过数据库中的自动 POCO 生成将其“往返”回代码。从未使用过代码优先,我不确定这是否可以做到。

重要提示截至 2015 年 1 月,Excel 或 LinqPad 都不支持 v4。元数据不同,我认为是由于缺乏“正式”关系。这使得 v4 目前不是很有吸引力,尤其是当 WCF 数据服务可以在几秒钟内从现有 EDMX 构建完整服务时。

更新

1/

现有代码优先:

http://msdn.microsoft.com/en-us/library/jj200620.aspx

2/

如果使用流式 API,您可以通过应用 [NotMapped]modelBuilder.Ignore<InMemClass>(); 从 EF 模型中排除实体,即使它们在其他实体中被引用。

卢克

【讨论】:

    猜你喜欢
    • 2015-01-31
    • 2014-06-17
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 2016-01-17
    • 2015-08-02
    相关资源
    最近更新 更多