NHibernate,自动映射如何生成版本

时间:2018-11-08 16:25:59

标签: nhibernate fluent-nhibernate nhibernate-mapping fluent-nhibernate-mapping

我试图在NHibernate中使用带有自动映射的版本。

我希望使用此配置可​​以为每个新添加的记录自动创建一个版本,但是我会得到一个空值。

class Entity 
{
   public virtual Version { get; } 
}

 mapping
     .Version(prop => prop.Version)
     .Generated.Always()
     .Not.Nullable();

我不确定应该如何在NHibernate中配置版本,所以我想知道我在做什么,我做对了。

还可以通过避免将Version属性添加到Entity class来配置版本吗?

1 个答案:

答案 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>();
                })));