考虑到以下要求,我试图利用ORM:

1)使用.NET Framework(最新框架没问题)
2)必须能够交替使用Sybase,Oracle,MSSQL
3)模式主要是静态的,但有动态部分。

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

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

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

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

我真正喜欢的是能够以某种方式“喂养” ORM与该元数据(以它理解的方式)并在那时拥有它允许我操纵数据。

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

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

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

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

(但是,它看起来不像SubSonic,因为没有Sybase提供商(见上文)

有帮助吗?

解决方案

根据此博客,您实际上可以使用 NHibernate与动态映射。虽然需要一些调整......

其他提示

我们做了一些使用NHibernate,但是我们停止了项目,因为它没有为我们提供我们想要的投资回报率。我们最终编写了我们自己的ORM / SQL层,它运行得非常好(因为我不再在那里工作,我猜它仍然可以工作)。

我们的系统使用开源项目生成SQL(不再记住名称),我们用自己的基于Xml的语言(查询标记语言 - QML)构建了所有查询。然后我们可以使用selection,wheres,groups等构建一个xmlDocument,然后将它发送到SqlEngine,它将把它变成一个Sql语句并执行它。我们在所有这些中讨论,但从未实现过缓存。这将允许我们为经常使用的查询缓存Qmls。

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

“让它在那时允许我操纵数据” - 什么操纵数据?

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

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

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

MSDN:LINQ to Entities

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top