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

什么';对于没有ID的对象,使用NHibernate的最佳方法是什么?,nhibernate,Nhibernate,我的应用程序中有一些类不需要持久化ID。这些可能是用户日志或审计记录之类的内容。我可以给它们添加一个任意id,但我想避免,因为它们没有任何意义 这些对象的检索总是在另一个键(如UserId)上进行的,该键不是记录的唯一键。如果您希望将来能够对该记录执行CRUD操作,您可以重新考虑使用ID字段。我认为您无法避免它。NHibernate详细信息使用“实体”,而不是数据库行和实体具有标识 考虑一下,如果您要读回其中一些记录,修改它们并尝试保存它们,会发生什么情况。NHibernate不知道要修改哪个数

我的应用程序中有一些类不需要持久化ID。这些可能是用户日志或审计记录之类的内容。我可以给它们添加一个任意id,但我想避免,因为它们没有任何意义


这些对象的检索总是在另一个键(如UserId)上进行的,该键不是记录的唯一键。

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

我认为您无法避免它。NHibernate详细信息使用“实体”,而不是数据库行和实体具有标识

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


因此,您要么需要创建一个人工ID,要么只保存它们而不使用NHibernate(即使用直接SQL,如果您愿意,可以通过NHibernate ISession对象运行直接SQL)。如果数据库空间真的很重要(即,您将拥有数百万个数据库空间),我建议使用后一种方法,否则添加人工ID非常容易。

因为NHibernate处理实体,所以您必须具有标识实体的内容。最好有一个单独的唯一id字段,因为这是NHibernate设计的工作方式,不与之抗争要容易得多


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

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

+1在复合id上使用,尽管我大量使用它们,而且我必须说问题并不多。。。