我如何利用ORM来处理其架构直到运行时才知道的数据库?
考虑到以下要求,我正在尝试利用ORM:
1)使用.NET Framework(可以使用最新的框架)
2)必须能够互换使用Sybase,Oracle,MSSQL
3)模式主要是静态的,但是有动态的部分。
我对SubSonic和NHibernate有点儿熟悉,但并不十分熟悉。
我对ORM可以做我想做的事情感到the,但是目前我还不知道如何利用它。
SubSonic可能不是最佳选择,因为它当前不支持Sybase,并且为此编写我自己的提供程序已经超出了我的能力和能力。
对于上面的#3,有几个元数据表,这些表描述了供供应商"装订"在现有数据库上的表。
我们将这些称为" MetaTables"和" MetaFields"。
有一个基本的静态架构,ORM(NHibernate ATM)可以很好地处理它。
但是,供应商可以(物理地)将表添加到数据库中,只要他们也将数据添加到元数据表中以描述其结构即可。
我真正想要的是能够以某种方式"馈送"带有该元数据的ORM(以它理解的方式),并在那时使它能够处理数据。
我的主要目标是减少我必须在这些动态表上进行的通用SQL语句构建的数量。
我还想避免担心发送给Sybase,Oracle或者MSSQL的SQL的差异。
我的主要问题是,直到运行时,我才能让ORM知道动态表,否则我将无法访问元数据
编辑:用法的示例可能类似于此处概述的用法:
IDataReader rdr = new Query(" DynamicTable1")。WHERE(" ArbitraryId",2).ExecuteReader();
(但是,由于没有Sybase提供程序,因此SubSonic似乎无法正常工作(请参见上文)
解决方案
我对如何在运行时使用orm感到有些困惑?如果ORM将在运行时动态构建某些内容,那么运行时代码如何知道orm动态执行的操作?
"到那时为止,它可以让我处理数据了"操纵数据是什么?
我可能在这里错过了一些东西,如果是这样的话,我深表歉意。 (我只在ORM中使用了自底向上方法)
IDataReader不会将任何内容映射到我们知道的对象。因此,示例应使用经典的查询生成器编写。
我们使用NHibernate进行了一些操作,但是由于该项目无法为我们提供所需的ROI,因此我们中止了该项目。我们最终编写了自己的ORM / SQL层,该层运行良好(因为我不再在那里工作了,所以我认为它仍然可以工作)。
我们的系统使用一个开放源代码项目来生成SQL(不再记住该名称),并且我们使用基于Xml的语言(查询标记语言QML)构建了所有查询。然后,我们可以构建一个带有selects,wheres,groups等的xmlDocument,然后将其发送到SqlEngine,该引擎将其转换为Sql语句并执行它。我们在所有这些中讨论了但从未实现过缓存。那将使我们能够为常见查询缓存Qml。
我们是否考虑过使用ADO.NET实体框架?
MSDN:LINQ到实体
它使我们能够以这样一种方式将数据库表映射到对象模型:无需考虑使用哪个数据库供应商,也不必担心DBA对实际表进行的细微改动就可以进行编码。映射保留在配置文件中,可以在修改数据库表时修改它们,而无需重新编译。
同样,使用LINQ to Entities,我们可以以OO方式构建查询,因此我们无需编写实际的SQL查询字符串。
根据此博客,我们实际上可以将NHibernate与动态映射一起使用。不过需要一些调整...