0

编辑:

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

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


你好,

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

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

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

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

我的查询在于映射我想要放置在单独表中的值对象时。使用类映射映射值对象的最佳方法是如下所示?我打算忽略它纯粹是为了休眠持久性的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);
  }
}

提前致谢。

4

1 回答 1

1

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

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

例如,取自这里

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 进行集成测试。

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

于 2011-03-10T11:19:31.847 回答