对于没有ID的对象,使用NHibernate的最佳方法是什么?

时间:2010-04-13 22:47:45

标签: nhibernate

我的应用中有一些类不需要持久保存ID。这些可能是用户日志或审计记录。我可以为他们添加一个仲裁ID,但我想避免这个,因为他们没有任何意义。

对这些对象的检索总是在另一个密钥(如UserId)上,这对于记录来说并不是唯一的。

4 个答案:

答案 0 :(得分:5)

因为NHibernate处理实体,所以你必须拥有识别实体的东西。最好有一个单独的唯一id字段,因为这是NHibernate设计工作的方式,并且更容易不打它。

但是,如果您有设计约束,而您实际上没有单独的id列,则可以使用在现有字段上定义的复合ID。例如,对于审核日志记录,您可以使用UserId和DateTime的组合。如果记录只写了一次而没有被操作(例如审计日志),那么你还应该在类映射中添加mutable = false来强制执行该操作。此外,请注意,如果您使用这样的复合ID,如果您将来尝试使用NHibernate的一些更高级的功能,它可能会导致问题。

答案 1 :(得分:2)

我认为你不能避免它。 NHibernate详细信息与“实体”,而不是数据库行和实体有一个身份。

如果您要回读其中一些记录,修改它们并尝试保存它们,请考虑会发生什么。 NHibernate不知道要修改哪个数据库行。当然,在你的情况下你不会这样做,但这正是NHibernate的目的。

所以你要么需要创建一个人工ID,要么在不使用NHibernate的情况下保存它们(即使用直接SQL,如果你愿意,可以通过NHibernate ISession对象运行)。如果数据库空间真的很重要(即你将有数百万这些),我建议采用后一种方法,否则很容易添加一个人工ID。

答案 2 :(得分:1)

如果您希望将来能够对此记录执行CRUD操作,您可以重新考虑拥有ID字段。

答案 3 :(得分:1)

您必须拥有某种形式的ID。在我的项目中,我只在实体的所有字段上使用composite-id,或者在数据库中使用复合键。