Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.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
NHibernate HiLo生成和SQL 2005/8模式_Nhibernate_Schema_Hilo - Fatal编程技术网

NHibernate HiLo生成和SQL 2005/8模式

NHibernate HiLo生成和SQL 2005/8模式,nhibernate,schema,hilo,Nhibernate,Schema,Hilo,我手头有个问题,我花了好几天的时间寻找答案,但都没有结果 我们正在使用HiLo Id生成,只要实体表与hibernate_unique_key表处于相同的模式中,一切似乎都正常工作 表结构非常简单。我在数据库中的hi value表作为dbo.hibernate\u unique\u键。dbo模式中还有几个实体表,它们可以正常工作。然后在“Contact”模式下有表(比如Contact.Person和Contact.Address) 在人员映射文件中: <class name="Person

我手头有个问题,我花了好几天的时间寻找答案,但都没有结果

我们正在使用HiLo Id生成,只要实体表与hibernate_unique_key表处于相同的模式中,一切似乎都正常工作

表结构非常简单。我在数据库中的hi value表作为dbo.hibernate\u unique\u键。dbo模式中还有几个实体表,它们可以正常工作。然后在“Contact”模式下有表(比如Contact.Person和Contact.Address)

在人员映射文件中:

<class name="Person" table="Person" schema="Contact">
<id name="Id" unsaved-value="0">
  <generator class="hilo">
    <param name="max_lo">100</param>
  </generator>
</id>
...

100
...
当我尝试插入Person实体时,我得到一个错误“Invalid object name”Contact.hibernate\u unique\u key”。这个错误肯定很清楚。因此我添加:

<param name="schema">dbo</param>
dbo
到我的映射文件/生成器元素。现在,当构建SessionFactory时,我得到一个“已添加具有相同密钥的项”错误。因此,现在我有点卡住了。我不能让HiLo生成器没有架构,因为它从类中提取架构,而我无法指定架构,因为它已被添加(可能是因为它是我在XML cfg文件中标识的“默认_模式”)

我在这里完全被冲洗了吗?我也必须吗

A) 将我的所有表保留在dbo模式或

B) 为数据库中的每个唯一模式创建单独的HiLo密钥表


这两种情况对我的应用程序都不是特别合适,所以我希望我可以“修复”“我的映射文件解决了这个问题。

我认为解决方案B没有任何问题。行为将基本相同。

每个数据库应该只存在一个这样的表。此类数据表应包含以下列(我们称此表为参数):

除了用作HiLo分配数据表外,还可以用作参数表。因此,ParamName字段是必需的。这可能包含以下数据:

HiLoId | TableName | ParamName | HiLoAssigned
---------------------------------------------
   1   | Parameters| HiLoId    |       3
   2   | Customers | CustomerId|    9425 
   3   | Invoices  | InvoiceId |  134978
当您需要一些其他参数时,例如一个作业的参数,该作业将删除历史记录表,然后可以将记录的年龄参数插入其中

嗯,我的话题比你实际问的要远一点。只是分享一些关于数据库设计/体系结构的其他想法


注意一下,看看我的答案。这可能也回答了您的问题,并为这个答案提供了更多信息。

您是否尝试在所有生成器(包括dbo架构中已经存在的生成器)上使用表名指定架构

<param name="table">dbo.hibernate_unique_key</param>
dbo.hibernate\u唯一\u键

hilo生成器在表名中查找“.”,并仅在表名中没有“.”时才对其进行限定(使用架构)。

这就是我们目前正在做的,只是为了让应用程序正常工作,但“首选”NH模式(以及我想使用的模式)是一个单键表,有多行(每个主实体一行),在hilo生成器映射中使用筛选器。谁告诉过你这是首选的NH模式?我想说这不是很重要,但最有效的解决方案(在没有序列的数据库中)是每个生成器(实体)一个表嗯。我想这只是我的一个假设,一张表就是多张表。如果你愿意的话,这是一种DB DRY原则。很公平,因为这是我们已经设置好的方法,我们将继续使用这种方法。比我需要的多一点,但还是很好的信息。我们应用程序中的HiLo内容都是由NHibern透明管理的ate,所以,至少在我们准备编写自己的IIIdentifierGenerator实现之前,我们不会将其扩展到这个级别。这个项目现在已经推出,所以我不会去更改它,但是下一个需要生成Id的项目,我会尝试一下这个建议。Kirk,你有机会验证这个建议吗?如果它有效的话艾德,请投赞成票,我可以利用这个名声
<param name="table">dbo.hibernate_unique_key</param>