Nhibernate 生成业务密钥

Nhibernate 生成业务密钥,nhibernate,Nhibernate,为业务密钥生成唯一编号的最佳方法是什么 在下面的示例中,我们的客户需要一个编号(OrderNumber),他们可以使用该编号来引用订单 <class name="Order"> <id name="Id" ... /> <property name="OrderNumber" column="order_number" /> </class> 我发现执行这些任务的最佳方法是用代码编写它们,而不是将它们泄漏到数据层。我不让尼伯内特算计。

为业务密钥生成唯一编号的最佳方法是什么

在下面的示例中,我们的客户需要一个编号(OrderNumber),他们可以使用该编号来引用订单

<class name="Order">
  <id name="Id" ... />

  <property name="OrderNumber" column="order_number" />

</class>

我发现执行这些任务的最佳方法是用代码编写它们,而不是将它们泄漏到数据层。我不让尼伯内特算计。我将此概念视为应用程序的一个成熟功能。这很好,因为我可以为它编写测试,并且具有灵活性。有时,在计算下一个序列号时还涉及其他因素,例如与另一个实体的关系。也许您需要客户领域内的顺序订单号:02-001,02-002用于客户02,01-001,01-002用于客户01

因此,我将SequenceNumber的概念推广到域模型对象,将其映射到NHibernate,并在我这边执行逻辑。每当我需要一个新的界面时,我都会使用一个类似

public interface ISequenceRepository
{
    string GetNextSequenceNumber(Customer customer);
}
它管理数据库表中一条记录(每个客户)中的当前序列号。无论何时调用此函数,它都会增加数据库中的placekeeper并返回值


工厂依赖于此接口,并使用它来构建需要序列号的对象。

您的Id生成器是什么?你为什么不把它当作身份证呢?对订单号是否有任何要求(如顺序号等?)您对订单号的要求是什么,可以是任何数字、字符串和数字等?订单号必须是顺序号。洞没问题。Id是应用程序分配的Guid。我们不希望使用业务标识符(OrderNumber)作为主键。有可能在普通房产上使用nHibernate发电机吗?我知道这是你的一个古老答案。但是我很喜欢这个主意!你认为你可以分享你的SequenceNumber对象,它的映射吗?此外,您如何在客户机(ie,02)的存储中以事务方式应用数字(ie,003)。。。Cheers@Berryl-我还没有准备好任何东西,但是想象一下最简单的数据行-一个FK和一个int。模型看起来是这样的,一个实体引用和一个int。映射将是直接的。至于编号等业务规则。。这完全是情况所独有的。嘿,马特,谢谢你的快速反应。这很有帮助,但这一次似乎是我需要努力才能真正做到的事情之一。会写一篇很棒的博文,关于一个我肯定没有从领域角度看到的主题!干杯