使用NHibernate / Fluent NHibernate强制执行标识插入

4
我们使用NHibernate构建了一个相当健壮的系统,目前正在从单个数据库服务器迁移到两个服务器,一个用于管理,另一个用于面向公众的网站。主要是为了能够执行内容管理工作流等操作,而不会影响当前网站。目前,它们在同一台服务器上有两个数据库,但随着时间的推移,我可以看到使用两台物理机器并使用Web服务调用来推送数据。
例如,我们的市场营销人员之一决定通过管理界面引入新促销活动,并将其安排在两周后进行。我们正在开发一个调度系统,在启动时会将新促销活动推送到我们的生产服务器。原本打算使用相同的NHibernate提供程序进行数据推送,但我们需要保持引用完整性。
我们正在使用Fluent NHibernate,我可以写两个不同的类映射,然后使用某种依赖注入(如StructureMap)来选择加载哪个映射。我希望有更好的解决方案,因为这似乎很难随着系统的增长而维护。你有什么建议吗?

你的问题是什么?你想在两个服务器上使用相同的ID吗? - BennyM
没错。我已经对ISession的各种方法编写了一些测试,包括Replicate、Merge、SaveOrUpdate和SaveOrUpdateCopy。所有这些方法都会抛出错误或生成一个新的ID而不是使用当前的ID。我看到了CurrentSession().Replicate(entity, ReplicationMode.Overwrite)这个方法-它看起来最有前途。这可能是一个错误吗? - jcavaliere
你是否使用数据库生成的ID? - BennyM
是的,我们有负载均衡服务器运行NHibernate代码,并且在那个时候将其生成在数据库中是唯一合理的位置。我很乐意听取建议,但是在代码中使用自定义ID生成器的想法会引发数据损坏的问题,如果它在应用程序服务器之间不同步。 - jcavaliere
1个回答

4

ISession.Replicate 不支持使用DB生成的ID值。正如NHibernate问题跟踪器中此问题所示。

  • 建议您使用自己的ID生成器或Guid/Guid.Comb,因为在这种情况下,您将能够使用NHibernate的复制功能(如问题所述)
  • 如果您需要一个简单的方案,您也可以编写自己的复制代码,而不使用NHibernate。
  • 使用您的数据库支持的复制技术。我以前在MS SQL服务器之间使用过复制,并且设置起来并不难。我相信其他RDBMS也支持类似的功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接