我正在开发一个软件,它将作为数据仓库的后端,其中事实定义将从xml文件中读取,相应的事实/维度表将在运行中创建。
我已经设法使它工作,即代码创建表,更新表结构,否则删除表并创建一个新表,它可以向表中插入数据,我们也可以从客户端应用程序查询数据仓库。到目前一切尚好。
现在我有两个问题
1) sql语句过多。问题:维护它将是一场噩梦
2) sql语句过多。问题:我被要求支持多个数据库,这意味着更多的sql语句。
但我想知道,使用Reflection.Emit为我的表生成类,然后使用ActiveRecord/nHibernate访问数据会有多难?这样我就不必做直接处理数据库的繁琐工作了。
发布于 2011-07-28 19:40:53
class Fact
{
public virtual int Id { get; set; }
IDictionary Properties { get; set; }
}模板
<hibernate-mapping>
<class name="Fact">
<dynamic-component name="Properties">
<!--placeholder -->
</dynamic-component>
</class>
</hibernate-mapping>用生成的替换<!--placeholder -->
<property
name="P1"
type="int" />
<property
name="P2"
type="string" />构建
var doc = new System.Xml.XmlDocument();
doc.LoadXml(generatedXml);
new NHibernate.Cfg.Configuration()
.AddDocument(doc)
...
.BuildSessionFactory();查询
var query = session.CreateCriteria<Fact>();
foreach (var restriction in restrictions)
{
query.Add(Restrictions.Eq(restriction.Name, restriction.Value))
}
var facts = query.List<Fact>();
SendBack(facts);创建/删除表
var dialect = Dialect.GetDialect(config.Properties);
var defaultCatalog = PropertiesHelper.GetString(NHibernate.Cfg.Environment.DefaultCatalog, config.Properties, null);
var defaultSchema = PropertiesHelper.GetString(NHibernate.Cfg.Environment.DefaultSchema, config.Properties, null);
var createTableSql = config.GetClassMapping(typeof(Fact)).Table.SqlCreateString(dialect, config.BuildMapping(), defaultCatalog, defaultSchema);
var dropTableSql = config.GetClassMapping(typeof(int)).Table.SqlDropString(dialect, defaultCatalog, defaultSchema);https://stackoverflow.com/questions/6849602
复制相似问题