2013-04-23 63 views
3

我想用NHibernate Envers記錄額外的字段「用戶」。我跟着幾個代碼示例,它們在語法方面似乎有所不同,可能是因爲它們中的一些已經過時了一些。但是我無法讓它工作。審計用戶使用NHibernate Envers流利配置

我得到這個例外:
只有一個屬性可能具有屬性[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]!

任何人有任何想法?我自己我會推測默認修訂實體仍然以某種方式使用,當我嘗試註冊我的自定義修訂實體時,會發生這種情況。

+0

我嘗試切換到AttributeConfiguration但我得到了完全相同的錯誤。 – ds99jove 2013-04-23 07:16:03

+0

聽起來很奇怪......如果仍然使用默認版本實體,您將/應該得到另一個異常消息。 您可以創建一個最小化,失敗的測試作爲拉取請求,如果您可以重新創建問題,請將其報告給JIRA? – Roger 2013-04-23 08:37:06

+0

問題解決了,錯誤不在Envers。感謝您的迴應! – ds99jove 2013-04-23 09:31:43

回答

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); 
});