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

时间:2011-03-10 01:35:14

标签: c# nhibernate fluent-nhibernate domain-driven-design value-objects

修改

嗨,尝试编辑以解答此问题。为了尝试改进这个问题,这里有一个直接到点的浓缩版本:

在使用流畅的nhibernate将值对象映射到单独的表时,代码是否可以使用,还是有替代方法?


您好,

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

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

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

将值对象映射到表示实体的表时,我感到很自在。例如,将地址值对象作为组件映射到customer表中。

我的查询在于映射我想要放在单独表中的值对象。是否使用类似下面的类映射来映射值对象的最佳方法?我计划忽略它,它纯粹存在于nhibernate持久性中。

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 个答案:

答案 0 :(得分: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进行集成测试。

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