在我们的开发团队中,我们使用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;
}
}