DDD - 在单独的表中使用 Fluent nHibernate 映射值对象

Posted

技术标签:

【中文标题】DDD - 在单独的表中使用 Fluent nHibernate 映射值对象【英文标题】:DDD - Mapping Value Objects with Fluent nHibernate in separate tables 【发布时间】:2011-03-10 01:35:14 【问题描述】:

编辑:

您好,正在尝试编辑以回答此问题。为了尝试改进这个问题,这里是一个直截了当的浓缩版本:

当使用 fluent nhibernate 将值对象映射到单独的表时,下面的代码是要走的路,还是有替代方案?


嗨,

出于这个问题的目的,我使用流畅配置的 nhibernate。

我正在稳步学习 DDD,但在对值对象的映射进行了一些澄清之后。似乎有很多关于将值对象映射为组件的信息。但是我想在某些情况下规范化我的数据库,因此会给值对象一个持久性标识(如果我是正确的,它不会违反 DDD 值对象规则)。

我在 SO 上看到了this 问题,但想了解有关如何设置和映射实际值对象的更多信息。

将值对象映射到表示实体的表时我很舒服。例如将地址值对象作为组件映射到客户表中。

我的查询在于映射我想要放置在单独表中的值对象时。使用类映射映射值对象的最佳方法是如下所示?我打算忽略它纯粹用于休眠持久性的 Id。

public class Address

  protected virtual int id get;
  public virtual string firstLine get;
  public virtual string city get;
  public virtual string postcode get;


public class AddressMap : ClassMap<Address>

  public AddressMap()
  
    Id(x => x.Id);
    Map(x=> x.firstline);
    Map(x=> x.city);
    Map(x=> x.postcode);
  

提前致谢。

【问题讨论】:

【参考方案1】:

我的建议是你应该使用 Fluent NHibernate 的自动映射功能,就像他们在 Sharp Architecture 项目中所做的那样。

我已经在多个项目中使用过,它使您能够更加专注于领域,而不必太担心持久性。

举个例子,取自here:

public class CustomerMap : IAutoMappingOverride<Customer>

    public void Override(AutoMapping<Customer> mapping) 
        mapping.Not.LazyLoad();
        mapping.Id(x => x.Id, "CustomerID")
            .GeneratedBy.Assigned();

        mapping.HasMany(hm => hm.Orders).KeyColumn("CustomerID");
    

如您所见,它们仅指定 Id 属性和到 Order 的映射,并让所有其他属性按约定映射。事实上,即使是 Id 也可以使用约定进行映射。

真正伟大的功能是您可以从您的域生成数据库架构。例如,这使您能够使用 SQLite 进行集成测试。

看看吧。无论如何,它对我来说非常有用。

【讨论】:

嗨,迈克,感谢您的意见。您的示例显示了将在域模型中具有标识的实体的自动映射。我对将仅具有持久标识的值对象映射到单独的表中以及对值对象使用 classmap 是否正确方法感到好奇。 当然。我读了你写的一半。好吧,我想你所做的对我来说看起来不错。在groups.google.com/group/dddcqrs 提问以获得一些深度。许多大人物都在那里闲逛。 东方我会给你答案,因为它把我推向了正确的方向。

以上是关于DDD - 在单独的表中使用 Fluent nHibernate 映射值对象的主要内容,如果未能解决你的问题,请参考以下文章

跳出查询以在存储过程中从单独的表中获取 where 子句

使用 cakephp 将复选框保存到单独的表中

将一系列日期存储在数据库中的一行或单独的表中

将所有列保存在一个表中与按数据类别保存在单独的表中

在两个单独的表中计算计划总额与实际总额

将库存数据与产品数据保存在单独的表中