NHibernate HiLo生成和SQL 2005/8架构

我手上有一个问题,我花了几天的时间寻找答案,无济于事......

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

表格结构非常简单。 我在db中将我的hi值表作为dbo.hibernate_unique_key。 几个实体表也在dbo模式中,并且它们的工作没有问题。 然后我们在“联系”模式下有表格(例如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>
...

当我尝试插入一个Person实体时,我得到一个错误“无效的对象名称'Contact.hibernate_unique_key'。这个错误肯定是足够清楚的。所以我补充:

<param name="schema">dbo</param>

到我的映射文件/发生器元素。 现在,当构建SessionFactory时,我会得到一个“具有相同密钥的项目已被添加。” 错误。 所以现在我有点卡住了。 我不能离开没有模式的HiLo生成器,因为它从类中获取模式,并且我不能指定模式,因为它已经被添加(大概是因为它是我在我的XML cfg文件中标识的“default_schema” )。

我在这里完全洗过? 我必须吗?

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

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

这两种情况都不适合我的应用程序,所以我希望能够“修复”我的映射文件以解决此问题。


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


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

HiLoId
TableName
ParamName
HiLoAssigned

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

HiLoId | TableName | ParamName | HiLoAssigned
---------------------------------------------
   1   | Parameters| HiLoId    |       3
   2   | Customers | CustomerId|    9425 
   3   | Invoices  | InvoiceId |  134978

而当你需要一些其他参数时,比如一个可以修剪你的历史表的工作参数,那么记录的年龄参数就可以被插入。

那么,我在这个问题上比你实际问到的要进一步。 只是分享一些额外的想法在数据库设计/架构。

注意this question ,并在那里看到我的答案。 这也可以回答你的问题,并为这个答案提供更多信息。


你是否已经尝试在所有生成器(包括已经在dbo模式中的那些)上指定表名的模式?

<param name="table">dbo.hibernate_unique_key</param>

hilo生成器查找'。' 在表名中,并且只有当其中不存在时才限定它(具有模式)。

链接地址: http://www.djcxy.com/p/19109.html

上一篇: NHibernate HiLo generation and SQL 2005/8 Schemas

下一篇: iphone keyboard is rotating into landscape while app setting is portrait only