asp.net - 具有自定义模型和 OData 的 Entity Framework 5 - Web API

标签 asp.net entity-framework asp.net-web-api entity-framework-5 odata

我正在评估新 Web 应用程序的一些技术。应该使用 EF5 和 Knockout JS 以及 Web API。我想在返回 IQueryable 时利用 OData 功能,但目前遇到问题,如何将我的 EF 模型转换为我的业务模型。

据我所知,如果我想要一个更复杂的数据库(计算列、存储过程……),我应该使用数据库优先方法。 (如有错误请指正)

因为我需要使用数据库优先方法并希望我的模型独立于数据库,所以我需要在 EF 模型之外创建它们。当我从 DataLayer 返回 IQueryable 的业务模型时,我失去了直接在数据库上执行其他查询的可能性,而是直接在 ASP.Net 服务器上执行它们。

当然,我不打算通过 OData 运行复杂的查询,并且无论如何都会将这些查询实现为附加操作,但它对于速度较慢的客户端(智能手机等)可能很有用,可以限制返回的数据并执行附加过滤器直接在服务器上。

有没有办法摆脱这个困境,仍然能够使用 OData?

问候 彼得

最佳答案

您可以尝试使用 Code First 和 EF 迁移来创建/升级数据库。通过迁移,您可以创建自定义迁移,这些迁移可以只是 SQL 脚本,以实现 Code First 本身无法自动完成的任务。数据库优先方法也很好。

问问自己是否真的想要/需要支持多个后端。使用 EF 可以实现,但很难维护。在这种情况下,我假设您的概念模型(csdl)对于所有数据库都是相同的,但您将有多个存储特定模型(ssdl 文件)。由于您的模型对于所有数据库都是相同的,因此无论您使用什么数据库,您都将拥有相同的 C# 类型。

当支持多个数据库时,您将无法对数据库运行 SQL 查询(或者更具体地说,如果您对另一个数据库运行特定于一个数据库的 SQL 查询,您将得到异常),但理想情况下您不需要它。在最坏的情况下,您可以将想要用 SQL 编写的逻辑封装在所有数据库中都存在的存储过程中。同样,我不知道什么时候需要这样做(唯一想到的是性能),但由于您计划使用 OData,所以除非您开始使用服务操作,否则无论如何都无法运行这些查询。

由于无论数据库如何,您的概念模型都是相同的,因此无论数据库如何,您都将拥有相同的类型。您可以尝试将它们用于数据层和业务模型(特别是如果您使用 POCO)。另一种选择是使用 POCO/DTO。 (我还没有尝试过 Web API 中的 OData 支持,但使用 WCF 数据服务,服务本身实际上会使用 EF 类型,因此您甚至无法告诉服务使用不同的类型集)。

关于asp.net - 具有自定义模型和 OData 的 Entity Framework 5 - Web API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14543179/

相关文章:

c# - 将传递的对象转换为某种东西

c# - 使用 Microsoft Jet OLEDB 对 CSV 的列限制

c# - ASP.net 为什么这些查询没有执行?

sql-server - 是什么导致 EF6 的 Migrate.exe 出现 TypeLoadException?

c# - SQL 创建触发器命令通过 MySQL Workbench 运行良好,但通过 Entity Framework 调用时出错

c# - 传递 web api 参数时出现 404

asp.net-web-api - ASP.Net Web API - 扩展大量写操作

c# - 如何动态更改mvc3中标签的可见性?

c# - Entity Framework 6.1 中的事务范围回滚

asp.net - DbSet<> 不包含 'ToListAsync()' 的定义,尽管我将 .NET 3.1 与 EF Core 一起使用