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