如何使用NHibernate映射强类型实体ID

时间:2019-09-17 15:00:00

标签: c# nhibernate domain-driven-design fluent-nhibernate-mapping ddd-repositories

在我们的开发团队中,我们使用NHibernate将域模型(DDD)映射到关系数据库。
我们使用strongly-tpyed entity IDs in order to avoid primitive obsession。 我们的首次尝试是使用CompositeId概念,该概念允许映射 一个键的一个或多个组件(即普通的旧类)。但这并不适合 使用该概念作为非复合键,以及apidocs 对于CompositeId,建议不要一般使用该概念。此外,我们的 NHibernate.StaleStateException导致数据库更新错误地失败,类似于所描述的问题here

是否有更好的方法使用NHibernate将强类型实体ID映射到数据库?

用于说明我们当前尝试的代码段:

using FluentNHibernate.Mapping;

public class BlogMapping : ClassMap<Blog>
{
    Table("blogs");
    CompositeId(p => p.Id).Access.CamelCaseField().KeyProperty(id => id.Value);
}

博客定义为

public class Blog
{
  public Id<Blog> Id
  {
    get => id;
    private set => id = value; //für NHibernate
  }
  // ctor for NHibernate, do not delete
  private Blog() : base(new Id<Blog>())
  {
  }
  public Blog(Id<Blog>){}
}

通用ID类型定义为

public class Id<T>
{
  // NOTE: Private set is needed for NHibernate
  // readonly not possible, because it is currently not supported
  public string Value { get; private set; }

  public Id(string value)
  {
    this.Value = value;
  }
}

0 个答案:

没有答案