哪个 ORM 会给我经过编译测试的查询?

Posted

技术标签:

【中文标题】哪个 ORM 会给我经过编译测试的查询?【英文标题】:Which ORM will give me compile-tested queries? 【发布时间】:2009-05-28 17:02:42 【问题描述】:

linqtosql 编译时间是否经过测试?


编辑:

假设我编写了一个引用名为“TotalSales”的列的查询。然后,我将数据库中的列重命名为 TotalSales2(以及任何其他配置文件,例如:nHibernate 中的 Employee.cfg.xml)。 当我编译项目时,我希望 Visual Studio 告诉我“totalSales”列不存在,然后我会去更改它。

【问题讨论】:

编译时测试是什么意思?你能详细说明一下吗? 我假设他的意思是在编译时进行检查以确保查询将运行并且映射映射到存在的表和列。 "以及任何其他配置文件,例如 nHibernate 中的 Employee.cfg.xml" 你不是在这里更改映射吗?如果是这样,任何 orm 都可以做你想做的事 【参考方案1】:

据我所知,没有。例如,它们通常会让您创建无法转换为 SQL 的 LINQ 查询。此外,我不知道有任何编译时检查您的映射是否正确映射到您的数据库。

在我看来,您可以而且应该在测试中执行所有这些检查。大多数 ORM 使这很容易做到。

【讨论】:

单元测试可以完成这项工作,但它仅用于运行时检查【参考方案2】:

我使用LLBLGen,但在进行数据模型更改时必须“刷新”它。我不认为你会得到一个在编译时检查数据库修改的 ORM。你的要求很高。

【讨论】:

+1 我同意代码生成是最简单的解决方案,即使更改数据库时必须重新生成代码。 根据领域模型升级数据库结构的工具也很有效。【参考方案3】:

在 DataObjects.Net 中,由 [Field] 属性标记的属性始终绑定到数据库中的字段,因此您可以确定查询将被翻译。如果您使用非持久字段或其他不受支持的语句,查询翻译器将在运行时失败或对获取的对象(在客户端)执行此类操作。

通常编译时验证是不可能的,或者理论上可以通过特殊的构建后任务执行,这将扫描编译的代码,查找所有查询并验证它们。但是这样的检查会严重减慢编译过程。

【讨论】:

【参考方案4】:

也许不完全是您要查找的内容,但如果使用 Entity Framework 并从设计器中选择“从数据库更新模型”,您将收到消息说如果您更改字段不再映射名字。

这不会在您构建项目时自动发生。

【讨论】:

【参考方案5】:

基本上,您需要同时具备 2 个功能:

编译时检查查询(= 具有 LINQ 实现的 ORM)。这通常不是问题 - 至少有一些工具支持这一点。 基于数据库架构更新实体的预构建步骤。 AFAIK 很少以这种方式实现 - 通常您必须通过模式显式更新模型。请注意,这部分通常相当昂贵。

【讨论】:

【参考方案6】:

如果您将代码生成步骤作为预构建事件包含在内,SubSonic 可以做到这一点。

【讨论】:

【参考方案7】:

我使用了一个名为 DODS 的 Java 工具,它是在 ca 开发的。 2000 带有 Enhydra 应用程序服务器。 DODS 还在附近:http://www.enhydra.org/tech/dods/

DODS 的工作方式以及满足您的编译时验证目标的原因在于,它是一种代码生成工具。它生成与数据库中的表相对应的 Java 类。这些类的对象实例对表中的每一列都有 getter 和 setter。当然,如果您更改数据库结构,您必须使用 DODS 重新生成 Java 代码。

只要您使生成的代码与您的数据库结构保持同步,它就会提供编译时验证,即任何使用这些类的应用程序代码正在查询有效的表和列。

无论如何,我意识到您使用 C# 和 ASP.NET 标记了您的问题。生成 Java 代码的工具不会对您有那么大的帮助。但是可能还有另一种更专门用于 .NET 的工具,它的工作原理与生成映射到数据库结构的代码的原理相同。因此,我建议将您的 search 范围缩小到 .NET ORM 工具,这些工具可以说明代码生成。

【讨论】:

以上是关于哪个 ORM 会给我经过编译测试的查询?的主要内容,如果未能解决你的问题,请参考以下文章

laravel Eloquent ORM - 如何获得编译查询?

c++重载

C - 编译错误

Django vs SQLAlchemy:哪个 Python ORM 更好

.NET Standard 类库的编译与 .NET Framework 有何不同?

JAVA语言中,CLASS文件存放的是啥