0

提前道歉,这是一个很长的问题。

(TL;DR:是否有人对使用 EF 和使用 WCF 数据服务/OData 公开的动态字段有任何建议)

我在使用 WCF 数据服务和 EF 时遇到了一些概念问题,特别是与将某些数据公开为 OData 服务有关。

基本上我的问题是这个。我公开的数据库允许用户动态添加字段(用户定义的字段),它使用一个系统,这些字段直接添加到基础 SQL 表中。此外,当您想向无法使用直接 SQL 的表添加数据时,您必须通过它们提供的 API。(它是 SAP Business One,fwiw)。

我已经成功构建了一个系统,该系统通过 XML 公开各种对象,并允许客户端通过发送 XML 消息来更新或添加新实体到 SBO,虽然它运行良好,但它并不真正适合移动应用程序,因为它非常重 XML 并且入口点是一个老式的 asmx 网络服务。我想尝试将其用于移动开发,并将 Odata 与 WCF 或 Web API 一起使用。(我知道我可以更改为 WCF 服务,允许处理 JSON 格式的请求,并开始返回 JSON 数据,但似乎必须有一个更...本地的...方式)

最初我不考虑为此使用 EF 的可能性,因为 a)动态字段和 b)EF 只能是只读的;必须拦截添加/更新实体并将其路由到 SBO DI 服务器。但是,我正在回过头来考虑它,并正在寻找一些关于如何处理的建议(否定的或其他的!)。

我基本上想做的是这个

  • 将 SBO 的基表(除非它们自己发布补丁,否则不会更改)公开为 EF 实体,具有所有通常的关系优点。事实上,我实际上不会直接公开表,我将使用一组过滤的 SQL 视图作为数据源,因为这与我们所做的各种其他事情相关联,以便仅将某些数据公开给第三方。

  • 将特定用户添加的任何 UDF 公开为每个实体的某种 EAV 子集合。

  • 拦截任何添加或更新对象的请求,并通过我拥有的现有引擎路由这些请求,以便与 SAP 数据导入服务交互。

我想我的主要问题是这个;假设我实现了一个表示销售订单的 EF 实体,该实体包含一个 Header 和 Details 集合。对于这些类中的每一个,我坚持使用用户定义字段和值的 EAV 类型集合。允许 OData 过滤系统直接在 EAV 集合上工作涉及多少工作(例如,客户端能够请求Service/Orders/$filter=SomeUdfField eq SomeValue,其中该请求必须向下传递到 EAV Order 标头实体的集合

或者,例如,是否有可能从某种元数据动态生成 EF 模型(我不介意如何 - 代码生成或模型构建库),这意味着我可以公开每个实体,包括动态字段,作为一个合适的 EF 模型?如果您读到这里,请提前非常感谢:)

4

1 回答 1

2

对于现有 EF 上下文的基本内容,WCF 数据服务效果很好。如上所述,只要您想添加一些自定义功能,就需要做更多的工作。

您所描述的内容是可能的,但您需要构建自己的自定义数据提供程序来处理元数据的动态生成以及添加/更新/删除的自定义挂钩。

可能值得研究WCF Data Services Toolkit,它是一个自定义提供程序,它在 WCF Data Services 上使用存储库模式以方便使用,但它不提供自定义元数据生成。

于 2013-01-16T00:41:20.723 回答