使用NHibernate Envers流式配置审核用户

时间:2013-04-23 05:33:56

标签: nhibernate nhibernate-envers

我正在尝试使用NHibernate Envers来记录其他字段“user”。我已经遵循了几个代码示例,这些示例在语法方面似乎有所不同,可能是因为它们中的一些有点过时了。但是我无法让它发挥作用。

我得到了这个例外:
只有一个属性可能具有[RevisionNumber]属性!

我的自定义修订实体:

public class CustomRevisionEntity
{
    public virtual int Id { get; set; }
    public virtual DateTime RevisionTimestamp { get; set; }
    public virtual Guid UserIdentityId { get; set; }

    public override bool Equals(object obj)
    {
        if (this == obj) return true;
        var revisionEntity = obj as CustomRevisionEntity;
        if (revisionEntity == null) return false;

        var that = revisionEntity;

        if (Id != that.Id) return false;
        return RevisionTimestamp == that.RevisionTimestamp;
    }

    public override int GetHashCode()
    {
        var result = Id;
        result = 31 * result + (int)(((ulong)RevisionTimestamp.Ticks) ^ (((ulong)RevisionTimestamp.Ticks) >> 32));
        return result;
    }
}

我的IRevisionListener:

public class RevInfoListener : IRevisionListener
{
    public void NewRevision(object revisionEntity)
    {
        var casted = revisionEntity as CustomRevisionEntity;

        if (casted != null)
        {
            casted.UserIdentityId = Guid.NewGuid(); // TODO
        }
    }         
}

首先,我使用代码映射来映射实体:

_modelMapper.Class<CustomRevisionEntity>(entity =>
{
    entity.Property(x => x.Id);
    entity.Property(x => x.RevisionTimestamp);
    entity.Property(x => x.UserIdentityId);
});

然后我配置Envers和NHibernate

var enversConf = new FluentConfiguration();
enversConf.SetRevisionEntity<CustomRevisionEntity>(x => x.Id, x => x.RevisionTimestamp, new RevInfoListener());
enversConf.Audit<OrganizationEntity>().Exclude(x => x.Version);
configuration.IntegrateWithEnvers(enversConf); // This is the nh-configuration

最后一行给了我例外:
只有一个属性可能具有[RevisionNumber]属性!

有人有什么想法吗?我自己会推测默认修订实体仍以某种方式使用,当我尝试注册我的自定义修订实体时,就会发生这种情况。

1 个答案:

答案 0 :(得分:3)

出现错误消息,因为Id属性被映射了两次。

在我们的映射类中,我们有了这个

_modelMapper.BeforeMapClass += (modelInspector, type, classCustomizer) => classCustomizer.Id(type.GetProperty("Id"), (idMapper) =>                                                                                                                                     
{
    idMapper.Access(Accessor.Property);
    idMapper.Generator(Generators.GuidComb);
});

然后我们再次尝试将Id映射为CustomRevisionEntity

的属性

最终的映射:

_modelMapper.Class<CustomRevisionEntity>(entity =>
{
    entity.Id<int>(x => x.Id, mapper => mapper.Generator(Generators.Identity));
    entity.Property(x => x.RevisionDate);
    entity.Property(x => x.UserIdentityId);
});