Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 对发出的代码使用nNHibernate_.net_Database_Nhibernate_Reflection.emit - Fatal编程技术网

.net 对发出的代码使用nNHibernate

.net 对发出的代码使用nNHibernate,.net,database,nhibernate,reflection.emit,.net,Database,Nhibernate,Reflection.emit,我正在开发一个软件,它将作为数据仓库的后端,在这个软件中,事实定义将从xml文件中读取,并动态创建相应的事实/维度表 我已经设法使它工作,即代码创建表,更新表结构,如果可能的话,否则删除表并创建一个新表,它可以将数据插入表中,我们也可以从客户端应用程序查询数据仓库。到目前为止还不错 现在我有两个问题 1) sql语句太多。问题是:这将是一个需要维护的夜晚 2) sql语句太多。问题:我被要求支持多个数据库,这意味着更多的sql语句 我必须承认,我对(n)Hibernate或Reflection.

我正在开发一个软件,它将作为数据仓库的后端,在这个软件中,事实定义将从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>
质疑


这将有助于查看后端的API。如果所有内容都是通过字符串查询的,则考虑使用EAV模型编写固定类。
class-Fact{public-virtual-int-Id{get;set;}///////Propertyname/Value-pairs///public-virtual-IDictionary-Properties{get;set;}
应用程序使用套接字与客户端交互。客户端只能发送两个命令,即更新我们正在收集的事实,如“更新\u事实\u定义\u事实\u定义\u XML\u转到这里”和在读取事实定义文件后查询事实,即“查询\u描述\u在\u XML中”,我们创建适当的事实和维度表,并在已知目录下的文件中查找所需的事实。代码知道文件结构和事实之间的映射。当收到查询时,代码知道要查询的表,因此它将xml转换为sql并返回结果。但设计起来似乎更复杂。它不仅会占用更多的空间,而且速度会慢很多,这显然是我不想要的:(.更重要的是,我想摆脱sql语句,我发现了以下关于在nHibernate中使用这种方法的博文。你能指出一个更好的起点吗?我可能有多个事实类,每个都有自己的维度集。在编译时不知道会有多少事实或维度…我不想一个包含所有维度的大型事实表。我可以为每个事实类实例创建单独的映射吗?是的,您可以,尽管您需要多个SessionFactory来保存同一事实类的不同映射,并且您可能需要多个事实表?或者每个子类具有表的不同事实子类型?需要更多信息我知道为什么我们要使用“限制”。我必须使用nhibernate在网格中动态加载表,我认为这对我很有帮助。在使用/显示数据之前,有一些限制可以过滤数据。
<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);