0

我有一个实体Account,在正常情况下,它的 Guid Id 将由 NHibernate 生成。但是,我想对一些AccountID 进行“硬编码”,这些帐户将在任何地方被引用并提供非常具体的功能。

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

我心想,这似乎ISession.Merge是为了什么,但对象并没有持久化。然后我对自己想,这一定ISession.Persist是为了,但这会引发一个异常,抱怨坚持一个分离的对象。 ISession.SaveOrUpdate同样不会持久化对象。

我需要做什么才能在 NHibernate 中保留这些“预制”对象?

4

3 回答 3

3

您可以使用重载的 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);
于 2018-03-23T15:31:22.217 回答
0

将这些预定义的 Guid 放在字符串常量中。您可以从字符串常量创建 Guid 实例。在应用程序启动中使用这些 guid 查询数据库中的对象。如果找到更新对象并在数据库中进行更新。如果未找到,则使用预定义的 guid 创建对象实例并进行插入。

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

更新:这不是那么简单。NHibernate 可能会尝试使用新的 Guid 填写 ID,问题是如何告诉 NHibernate 有时您想自己执行此操作?

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

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

于 2013-03-25T00:00:48.493 回答
0

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

assigned要么使用 ad-hoc SqlQuery,要么为具有Id的初始化创建部分修改的映射配置。

于 2013-03-25T14:44:51.317 回答