将 OData 与与 EF 实体分离的模型一起使用?
Using OData with models decoupled from EF entities?
我们正在考虑在下一个项目中使用 OData。有许多示例如何将 OData 与 Entity Framework 一起使用。只要您在 REST 接口上公开数据库实体 1:1,这些示例看起来就非常简单。
为了将我们的数据库实体与我们的 api 模型分离,我们过去常常在从我们的存储库返回它们之前使用 automapper 映射它们。当然,这样一来,我们就失去了 ORM 可以给我们带来的很多安慰。但是过去告诉我们,使用数据库实体的一对一表示通常比利用 EF/Linq2SQL sovled 的功能产生更多的问题,即使是 POCO。
如果我们想保持 api 模型解耦并考虑使用 OData,就会出现很多问题。 OData 在查询资源方面提供了很大的灵活性,但 api 客户端拥有的所有自由,都必须以某种方式向下转换到数据库。在内存中应用查询选项显然不是一个选项,因为它需要您加载整个 table。仅支持一些查询选项似乎也不是 OData 背后的想法。
那么,我们是否被迫将我们的实体直接公开给我们 api 以有意义的方式使用 OData?
仅仅因为您采用了 OData,并不一定意味着您必须为每个资源实施整个事情。
我一直对 OData 的 "magic box" 方面持怀疑态度。通过将数据实体作为资源公开,您将 public 服务定义耦合到底层数据库系统。您的客户端集成将极易受到更改的影响。
但是,这是 实现 的问题,而不是标准本身的问题。 OData 可以很好地完成很多事情,并且可以成为跨 API 建立语法一致性的有用方法。
您可以自由实施查询功能的子集。这隐含在 .Net 实现中,因为 ODataValidationSettings class 允许您指定要支持的函数、运算符和查询选项。您还可以通过直接解析 ODataQueryOptions 对象来手动控制将查询提交到基础数据存储的方式。
你需要做的是一种叫做投影的东西。这是您在 linq 查询末尾使用 select 语句将结果投影到不同的 class 的地方。然后,这将完全抽象化您从源返回的数据,同时仍然具有此调用中的任何查询仍在数据库中执行的好处
https://nrepository.codeplex.com 中有一些演示代码显示了在使用 EF 的 OData 控制器中的实际操作。
我们正在考虑在下一个项目中使用 OData。有许多示例如何将 OData 与 Entity Framework 一起使用。只要您在 REST 接口上公开数据库实体 1:1,这些示例看起来就非常简单。 为了将我们的数据库实体与我们的 api 模型分离,我们过去常常在从我们的存储库返回它们之前使用 automapper 映射它们。当然,这样一来,我们就失去了 ORM 可以给我们带来的很多安慰。但是过去告诉我们,使用数据库实体的一对一表示通常比利用 EF/Linq2SQL sovled 的功能产生更多的问题,即使是 POCO。
如果我们想保持 api 模型解耦并考虑使用 OData,就会出现很多问题。 OData 在查询资源方面提供了很大的灵活性,但 api 客户端拥有的所有自由,都必须以某种方式向下转换到数据库。在内存中应用查询选项显然不是一个选项,因为它需要您加载整个 table。仅支持一些查询选项似乎也不是 OData 背后的想法。
那么,我们是否被迫将我们的实体直接公开给我们 api 以有意义的方式使用 OData?
仅仅因为您采用了 OData,并不一定意味着您必须为每个资源实施整个事情。
我一直对 OData 的 "magic box" 方面持怀疑态度。通过将数据实体作为资源公开,您将 public 服务定义耦合到底层数据库系统。您的客户端集成将极易受到更改的影响。
但是,这是 实现 的问题,而不是标准本身的问题。 OData 可以很好地完成很多事情,并且可以成为跨 API 建立语法一致性的有用方法。
您可以自由实施查询功能的子集。这隐含在 .Net 实现中,因为 ODataValidationSettings class 允许您指定要支持的函数、运算符和查询选项。您还可以通过直接解析 ODataQueryOptions 对象来手动控制将查询提交到基础数据存储的方式。
你需要做的是一种叫做投影的东西。这是您在 linq 查询末尾使用 select 语句将结果投影到不同的 class 的地方。然后,这将完全抽象化您从源返回的数据,同时仍然具有此调用中的任何查询仍在数据库中执行的好处
https://nrepository.codeplex.com 中有一些演示代码显示了在使用 EF 的 OData 控制器中的实际操作。