gpt4 book ai didi

.net - 将 nNHibernate 与发出的代码一起使用

转载 作者:搜寻专家 更新时间:2023-10-30 23:20:47 26 4
gpt4 key购买 nike

我正在开发一个用作数据仓库后端的软件,其中将从 xml 文件读取事实定义,并即时创建相应的事实/维度表。

我已经设法让它工作,即代码创建表,如果可能的话更新表结构,否则删除表并创建一个新表,它可以将数据插入表中,我们也可以从我们的客户端应用程序查询数据仓库.到目前为止一切顺利。

现在我有两个问题

1)sql语句过多。问题:维护将是噩梦

2) sql语句过多。问题:我被要求支持多个数据库,这意味着更多的 sql 语句。

我必须承认,我对 (n)Hibernate 或 Reflection.Emit 都没有太多研究。

但我想知道使用 Reflection.Emit 为我的表生成类然后使用 ActiveRecord/nHibernate 访问数据有多难?这样我就不必做直接处理数据库的脏活。

最佳答案

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);

关于.net - 将 nNHibernate 与发出的代码一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6849602/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com