3

鉴于以下要求,我正在尝试利用 ORM:

1) 使用.NET Framework(最新的Framework 还可以)
2) 必须能够互换使用Sybase、Oracle、MSSQL
3) 架构大多是静态的,但也有动态的部分。

我对 SubSonic 和 NHibernate 有点熟悉,但并不深入。
我觉得 ORM 可以做我想做的事,但我现在不知道如何利用它。

SubSonic 可能不是最优的,因为它目前不支持 Sybase,并且我现在为它编写自己的提供程序超出了我的资源和能力。

对于#3(上图),有几个元数据表,它们描述了供应商可以“装订”到现有数据库的表。
我们将这些称为MetaTablesMetaFields

有一个基本的静态模式,ORM(NHibernate ATM)可以很好地处理它。
但是,供应商可以(物理地)将表添加到数据库中,只要他们还将数据添加到元数据表中以描述其结构即可。

我真正想要的是能够以某种方式用元数据(以它可以理解的方式)“喂养”ORM,并在那时让我能够操纵数据。

我的主要目标是减少我必须在这些动态表上构建的通用 SQL 语句的数量。
我还想避免担心发送到 Sybase、Oracle 或 MSSQL 的 SQL 的差异。

我的主要问题是我无法让 ORM 知道动态表,直到运行时才能访问元数据

编辑:使用示例可能类似于此处概述的示例:

IDataReader rdr=new Query("DynamicTable1").WHERE("ArbitraryId",2).ExecuteReader();

(但是,SubSonic 似乎无法工作,因为没有 Sybase 提供程序(见上文)

4

5 回答 5

1

我们使用 NHibernate 做了一些工作,但是我们停止了这个项目,因为它没有为我们提供我们想要的 ROI。我们最终编写了自己的 ORM/SQL 层,效果很好(因为我不再在那里工作,所以我猜它仍然有效)。

我们的系统使用一个开源项目来生成 SQL(不再记得名字了),并且我们用我们自己的基于 Xml 的语言(查询标记语言 - QML)构建了所有查询。然后,我们可以使用选择、位置、组等构建一个 xmlDocument,然后将其发送到 SqlEngine,后者会将其转换为 Sql 语句并执行它。我们讨论过但从未实现过所有这些中的缓存。这将允许我们缓存 Qmls 以用于经常使用的查询。

于 2008-10-14T07:40:16.960 回答
1

根据this blog,您实际上可以将NHibernate 与动态映射一起使用。不过需要稍微调整一下...

于 2008-12-11T21:07:28.957 回答
0

我对在运行时如何使用 orm 感到有点困惑?如果 ORM 会在运行时动态构建某些东西,那么运行时代码如何知道 orm 动态做了什么?

“在那一点上让我可以操纵数据” - 什么是操纵数据?

我可能在这里遗漏了一些东西,如果是这样的话,我很抱歉。(我只真正使用了 ORM 自下而上的方法)

于 2008-09-25T21:48:06.530 回答
0

IDataReader 不会将任何内容映射到您知道的对象。因此,您的示例应该使用经典查询生成器编写。

于 2008-09-25T22:22:06.717 回答
0

您是否考虑过使用 ADO.NET 实体框架?

MSDN:LINQ 到实体

它允许您以这样一种方式将数据库表映射到对象模型,这样您就可以在不考虑使用哪个数据库供应商的情况下进行编码,也不用担心 DBA 对实际表所做的微小变化。映射保存在配置文件中,可以在修改 db 表时进行修改,而无需重新编译。

此外,使用 LINQ to Entities,您可以以 OO 方式构建查询,因此您无需编写实际的 SQL 查询字符串。

于 2008-10-19T05:13:24.863 回答