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