没有在实体上预先设置id,不能让它持久化

本文关键字:id 不能 持久化 设置 实体 | 更新日期: 2023-09-27 18:05:53

我有一个实体Account,在正常情况下,它的Guid Id将由NHibernate生成。然而,有一些Account Id我想"硬编码",帐户将被引用到任何地方,并提供非常特定的功能。

我想在配置文件中定义这些对象,并使用预配置的Guid Id完成,并且在启动应用程序时,检查这些帐户是否存在于数据库中。如果没有,我想按原样添加它们。如果它们存在,我想覆盖数据库版本并保留配置文件中设置的属性。

我想,这似乎是什么ISession.Merge是为,但对象不坚持。然后我想,这一定是ISession.Persist的作用,但是这会抛出一个异常,抱怨持久化一个分离的对象。同样,ISession.SaveOrUpdate也不持久化对象。

我需要做些什么来在NHibernate中持久化这些"预制"对象?

没有在实体上预先设置id,不能让它持久化

您可以使用重载的save (object obj, object id)保存具有特定id的实体;NHibernate ISession

/// <summary>
/// Persist the given transient instance, using the given identifier.
/// </summary>
/// <param name="obj">A transient instance of a persistent class</param>
/// <param name="id">An unused valid identifier</param>
void Save(object obj, object id);

将这些预定义的Guids放入字符串常量中。从字符串常量中可以创建Guid实例。在应用启动时,在DB中查询具有这些guids的对象。如果找到,更新对象并在DB中进行更新。如果没有找到,用预定义的guids创建对象实例并执行插入操作。

换句话说,这些"预制"对象没有什么特别之处。将它们视为常规对象,就像其他没有预定义id的对象一样。

更新:事情没那么简单。NHibernate可能会尝试用新Guid填充ID问题是如何告诉NHibernate有时候你想自己做这个?

会话。Merge将首先尝试从Db加载实体,如果它找到一个,它将合并内存实例与from- Db实例。否则,它将添加新的实例到数据库。

您总是可以使用ADO直接添加这些预定义的实体。. NET手动跳过NH,但这不是一个很好的解决方案。

如果你的映射说NH将生成Id,那么你不能使用NH插入特定的Id。

使用临时SqlQuery,或者为初始化创建一个部分修改的映射配置,该配置具有assigned Id。