NHibernate HiLo 生成和 SQL 2005/8 模式

标签 nhibernate schema hilo

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

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

表结构非常简单。我的 hi 值表在数据库中为 dbo.hibernate_unique_key。几个实体表也在 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>
...

当我尝试插入 Person 实体时,收到错误“无效的对象名称 'Contact.hibernate_unique_key'”。该错误肯定足够清楚。所以我添加:

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

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

我在这里彻底崩溃了吗?我必须这样做吗

A) 将我的所有表保留在 dbo 架构中或

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

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

最佳答案

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

HiLoId
TableName
ParamName
HiLoAssigned

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

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

当您需要一些其他参数时,例如会修剪表历史记录的作业参数,则可以将记录的年龄参数插入其中。

嗯,我对这个主题的了解比你实际问的要深入一些。只是分享一些数据库设计/架构方面的额外想法。

留意this question ,并在那里查看我的答案。这也可能回答您的问题,并为此答案提供更多信息。

关于NHibernate HiLo 生成和 SQL 2005/8 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3023917/

相关文章:

NHibernate 通过 session.Load() 创建代理,而不是通过 Linq 或 Criteria API

javascript - 如何验证 JSON 模式中的自定义类型?

javascript - Joi 验证 ||在对象数组中,至少一个对象应包含某个键的特定值

database - 什么是 Hi/Lo 算法?

oracle - hibernate 序列生成器不一致

wcf - NHibernate 类作为数据契约

c# - 每个子类策略在表中的列名错误,层次结构中有抽象类

NHibernate多对多在插入前删除所有关联

java - 需要使用看起来很奇怪的 Schema 来解析 XML