【问题标题】:Domain Driven Design, Containing Entities and NHibernate Persistence领域驱动设计、包含实体和 NHibernate 持久性
【发布时间】:2009-06-10 14:53:48
【问题描述】:

在我的领域驱动设计中,我有一个包含实体,比如 Car,它有一个组成实体列表,例如轮子。

现在,我想向我的汽车实体添加一个 ChangeWheel 方法。请注意,更换车轮并不会真正修改汽车实体。它只影响其车轮集合中的一个实体。 IE。 Car 实体有一个 IList 属性。在我的数据库模式中,我有一个没有引用 Wheels 的汽车实体 - 相反,Wheels 表有一个 CarId 的外键。

当我更换汽车的车轮时,我会更新特定的车轮记录。我要更新的唯一其他表是数据库中的版本审核表。

如果我通过 NHibernate 从存储库中提取 Car 实体,调用 ChangeWheel(...),然后再次保存,我可以将 NHibernate 配置为不保存新版本的 Car 记录吗?

我希望这一切都有意义 - 如果没有,请询​​问并提前感谢。

【问题讨论】:

  • 任何好的ORM都应该只在记录中的数据实际发生变化时才将数据保存到数据库表中。

标签: c# java domain-driven-design


【解决方案1】:

NHibernate 使用从 Iesi.Collections.Generic.ISet 派生的自己的集合来包装作为集合的属性(如您的情况下的 Wheels)。完成此操作后,它可以跟踪对集合的更改,这当然意味着它只发布所需的更新。

请记住,在这种情况下,您应该为 Wheel 实现 Equals 和 GetHashCode。这是一篇关于实现 Equals 和 GetHashCode 的博文:

Implemeting Equals and GetHashCode

【讨论】:

    【解决方案2】:

    NHibernate 会自然而然地做到这一点。您是否有现有的映射,或者这只是假设?

    【讨论】:

    • 目前只是假设性的。我正在考虑 NHibernate 的一个新项目。
    【解决方案3】:

    来自NHibernate docs

    • 当我们从 / 中移除 / 添加一个对象时 到一个集合,版本号 集合所有者递增。

    但是...您可以尝试保留新添加的 Wheel,但保留 Car 本身。这应该会产生预期的效果,但 NHibernate 将始终认为 Car 是脏的(注意你的 ISession 管理)

    【讨论】:

    • 谢谢 - 在使用 nhibernate 时,每个实体(业务对象和数据库表)是否都需要有版本号列/字段?
    • 没有。版本号用于乐观锁定。
    猜你喜欢
    • 1970-01-01
    • 2011-01-05
    • 2010-10-05
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    相关资源
    最近更新 更多