gpt4 book ai didi

winforms - 使用 NHibernate 在多个数据库之间复制实体

转载 作者:行者123 更新时间:2023-12-04 00:59:39 24 4
gpt4 key购买 nike

我有一个桌面(winforms)应用程序,它使用 Firebird 数据库作为数据存储(在嵌入式模式下),并且我使用 NHibernate for ORM。我们需要支持的功能之一是能够从外部文件导入/导出数据组。目前,这个外部文件也是一个与主数据库具有相同架构的数据库。

我已经设置了 NHibernate 来查看多个数据库,并且我可以同时使用两个数据库。然而,问题在于在两个数据库之间复制数据。我有两种复制策略:(1) 复制对象的所有相同 ID [aka import/export] 和 (2) 复制大部分新 ID [aka duplicate/copy]。我说“大部分是新的”,因为有些查找项将始终使用相同的 ID 进行复制。

使用新 ID 复制所有内容很好,因为我将只有一个“CopyForExport”方法,该方法可以创建所有内容的副本而不分配新 ID(或清除对象树中的所有 ID)。

处理这种情况并在数据库之间复制数据同时保持相同 ID 的“最佳实践”方法是什么?

澄清:我不是要同步两个数据库,只是导出一个子集(用户可选择)或数据以传输给其他人(然后将数据子集导入他们自己的数据库)。

进一步澄清:我认为我已经将问题归结为:
我想使用 NHibernate 的 ISession.SaveOrUpdate 功能,因此我使用未“分配”的身份生成器设置我的实体。但是,当我想覆盖生成的身份(用于在同一进程中的多个数据库之间复制数据)时,我遇到了问题。

有没有办法使用 Guid.Comb 或 UUID 生成器,但有时可以指定我自己的标识符(用于传输到具有相同架构的不同数据库连接)。

最佳答案

我找到了自己问题的答案:
关键是 ISession.Replicate 方法。这允许您在数据存储之间复制对象图并保持相同的标识符。要创建新的标识符,我想我可以使用 ISession.Merge,但我仍然需要验证这一点。

不过有一些注意事项:我的测试类引用了父对象(多对一关系),我必须使类非延迟加载才能使 Replicate 正常工作。如果我没有将它设置为急切加载(我猜是非延迟加载),它只会复制对象而不是父对象(我的 hbm.xml 文件中的 cascade="all")。

java Hibernate 文档引用了 Replicate(),但 NHibernate 文档没有(section 10.9 在 java 文档中)。

这对于复制行为是有意义的,因为我们希望在将实体转移到另一个数据存储之前拥有完全水合的实体。奇怪的是,即使两个 session 都打开(每个数据存储一个),当我想复制对象时,它并没有考虑对对象进行水合。

关于winforms - 使用 NHibernate 在多个数据库之间复制实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/254324/

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