gpt4 book ai didi

c# - NHibernate保存非持久实体,同时维护现有ID

转载 作者:行者123 更新时间:2023-11-29 13:26:21 26 4
gpt4 key购买 nike

这并不是一个真正常见的情况,但在这个特定的情况下,任务就是完成这一点:

  1. 序列化数据库 A 中使用 NHibernate 加载的现有实体列表
  2. 将序列化实体导出到文件
  3. 使用 NHibernate 作为持久代理将序列化实体文件导入数据库 B

问题是实体映射用 Id 生成器标记:

public class EntityMap
{
public EntityMap()
{
Id(x => x.Id)
.GeneratedBy.Guid();
// Other properties
}
}

有了这个映射,每次我打电话时:

ISession session = NHibernateSession.GetSession();
IList<Entity> entities = // Load entity from serialized object in a file

foreach(entity in entities)
{
session.Save(entity);
}

NHibernate 不断为这些实体生成新的 ID。

是否有一种方法可以使映射保持具有 Id 生成策略,但又能够以某种方式保留现有实体及其预定义的 Id?

最佳答案

这里的逻辑很简单:

您希望拥有应用程序分配的标识符。因此,您应该为应用程序分配的标识符配置 NHibernate。

你所要求的基本上是告诉 NHibernate 为你生成标识符,但无论如何还是坚持自己做。

人们还可以注意到,NHibernate 并不是真正的复制工具。您是否考虑过将实体序列化为 SQL 脚本,以便可以在目标数据库上简单执行?这将绕过 NHibernate 的 id 分配。

对于做分布式数据库,我的建议是:首先,我会查看数据库系统本身是否具有可用于此目的的任何类型的复制/数据流/数据镜像。如果这不起作用,我可能会尝试编写类似的内容 - 也就是说,在读取端也绕过 NH,只需执行简单的表读取并将 INSERT 语句写入文件,以便接收者可以应用。只要不需要或很少需要数据转换,这种方法就有效。如果数据需要复杂的转换(这是不可避免的)……那么,如果逻辑变得足够复杂,我们就会通过 NH 来完成它。

另一种方法是 try catch 修改原始数据库的输入(例如命令模式),并将相同的输入也传递给所有其他数据库。本质上是让每个系统对输入使用react - 通过确定性系统和相同的输入,所有数据库最终将处于相同的状态。

关于c# - NHibernate保存非持久实体,同时维护现有ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20086529/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com