我试图在NHibernate中使用带有自动映射的版本。
我希望使用此配置可以为每个新添加的记录自动创建一个版本,但是我会得到一个空值。
class Entity
{
public virtual Version { get; }
}
mapping
.Version(prop => prop.Version)
.Generated.Always()
.Not.Nullable();
我不确定应该如何在NHibernate中配置版本,所以我想知道我在做什么,我做对了。
还可以通过避免将Version属性添加到Entity class来配置版本吗?
答案 0 :(得分:2)
找到了我要做的事,
由于我使用SqlServer作为数据存储,因此RowVersion的类型为timestamp。
所以我必须进行以下配置
mapping
.Version(prop => prop.Version)
.CustomSqlType("timestamp") /// => add sql type
.Generated.Always()
.Not.Nullable();
并将版本的类型更改为byte []
public Entity
{
public virtual byte[] Version{get;}
}
这有效。它将自动生成一个时间戳。
因此,如果您正在使用其他数据存储(例如Oracle),则必须检查版本控制的类型,但从未与任何其他关系数据库一起使用,因此我不确定,但是值得尝试。
更新:
使用自动映射约定,而不是创建IAutoMappingOverride的映射
public class VersionConvetion : IVersionConvention
{
public void Apply(IVersionInstance instance)
{
instance
.CustomSqlType("timestamp");
instance
.Generated.Always();
instance
.Not.Nullable();
}
}
然后注册
/// => configure mappings, conventions, etc
configuration
.Mappings(map => map.AutoMappings
.Add(AutoMap.AssemblyOf<Entity>(new AutomappingConfiguration())
.Conventions.Setup(config =>
{
config.Add<VersionConvetion>();
})));