【问题标题】:avoiding duplicate transient instance in nhibernate避免在 nhibernate 中出现重复的瞬态实例
【发布时间】:2011-04-12 12:17:43
【问题描述】:

我的主要实体(帐户)图表如下所示:

帐户

  • 经理
  • 销售人员
  • 交易员

Manager、SalesPerson 和 Trader 实体的类型为 person。现在,在创建主要实体(以及内部实体)时,如果它不存在,我需要创建一个新的 Person。这引入了一个问题,如果同一个(新)人应该与销售人员和交易员相关联,我希望创建的同一个临时实体与两者相关联。但相反,我最终创建了 Person 对象的重复瞬态实例,这会在系统中创建重复项。我怎样才能避免这种情况?

【问题讨论】:

  • 您能否提供示例代码来证明您的问题?
  • 重复是什么意思?在什么“系统”中,数据库?
  • 假设在创建 Account 实体时,我拥有与 SalesPerson 和 Trader 相同的员工,这是我保存 Account 实体时将创建的新员工。当我查询数据库以检查 emp 是否已经存在时,我找不到它。所以我会说 accountObj.SalesPerson = EmployeeFactory.CreateEmployee(employeeId)。在 Trader 的下一步中,我将执行相同的操作,因为 emp 尚未保存。结果,已为 Trader 和 SalesPerson 分配了相同的 emp,但在 db 中,当我保存 accountObj 时,我最终创建了重复记录。我该如何解决这个问题?

标签: .net nhibernate duplicate-data transient


【解决方案1】:

您可以在创建 Person 对象后立即将其保存到数据库吗?然后它将在数据库中,当您检查它时,它就在那里。如果您使用本机主键,nHibernate 将在您调用 Save 时将其保存到数据库中。如果你没有使用原生主键,你将不得不调用flush。

或者,跟踪最近保存的 Person's,并首先检查那里。

【讨论】:

  • 这不会发生。 Nhibernate 收集查询直到 Commit/Flush。只有当你使用native主键时NHibernate才必须flush到db。
  • 好点。当我说“到数据库”时,我的意思是记录在数据库中。我已经更新了答案,希望能避免任何进一步的混淆。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-30
  • 1970-01-01
  • 1970-01-01
  • 2013-11-22
  • 1970-01-01
  • 2013-01-07
  • 2012-05-03
相关资源
最近更新 更多