NHibernate Envers ValidityAuditStrategy——我做错了什么?

NHibernate Envers ValidityAuditStrategy——我做错了什么?,nhibernate,nhibernate-envers,Nhibernate,Nhibernate Envers,我有以下配置来设置NH和Envers: var properties = new Dictionary<string, string>(); properties[NHibernate.Cfg.Environment.Dialect] = "NHibernate.Dialect.MsSql2008Dialect"; properties[NHibernate.Cfg.Environment.ConnectionDriver] = "NHibernate.Driver.SqlClien

我有以下配置来设置NH和Envers:

var properties = new Dictionary<string, string>();
properties[NHibernate.Cfg.Environment.Dialect] = "NHibernate.Dialect.MsSql2008Dialect";
properties[NHibernate.Cfg.Environment.ConnectionDriver] = "NHibernate.Driver.SqlClientDriver";
properties[NHibernate.Cfg.Environment.Hbm2ddlAuto] = "update";
properties[NHibernate.Cfg.Environment.FormatSql] = "true";
properties[NHibernate.Cfg.Environment.ShowSql] = "true";
properties[NHibernate.Cfg.Environment.ConnectionString] = "Data Source=localhost;Initial Catalog=OU_KASH;Integrated Security=True;Asynchronous Processing=true";
var cfg = new Configuration();
cfg.Configure()
    .SetProperties(properties)
    .AddAssembly(typeof(AliasTb).Assembly.FullName)
    ;

cfg.SetEnversProperty(ConfigurationKey.StoreDataAtDelete, true);
cfg.SetEnversProperty(ConfigurationKey.AuditStrategy, typeof(NHibernate.Envers.Strategy.ValidityAuditStrategy));
cfg.SetEnversProperty(ConfigurationKey.TrackEntitiesChangedInRevision, true);
cfg.SetEnversProperty(ConfigurationKey.GlobalWithModifiedFlag, true);

cfg.IntegrateWithEnvers(new AttributeConfiguration());

var factory = cfg.BuildSessionFactory();
它工作正常,但使用该选项,在提交事务(更新CompanyAddressTb对象)时会出现以下异常:

错误NHibernate.AssertionFailure-发生AssertionFailure-这可能表明NHibernate或自定义类型中存在错误。
System.InvalidOperationException:找不到实体NhDoodling.Entities.Domain.CompanyAddressTb_AUD和id 12962904的以前版本
在NHibernate.Envers.Strategy.ValidityAuditStrategy.updateLastRevision(ISession会话、AuditConfiguration auditCfg、IList l、对象id、字符串AuditEdentyName、对象修订、布尔throwIfNotOneEntry)
在NHibernate.Envers.Strategy.ValidityAuditStrategy.Perform(会话会话、字符串entityName、对象id、对象数据、对象修订)
在NHibernate.Envers.Synchronization.Work.AbstractAuditWorkUnit.Perform(ISession会话,对象修改数据)
在NHibernate.Envers.Synchronization.AuditProcess.executeInSession(ISession executeSession)中
在NHibernate.Envers.Synchronization.AuditProcess.dobeforTransactionCompletion()中
在NHibernate.Envers.Synchronization.AuditProcessManager.c__DisplayClass4.b__0()中
在NHibernate.Engine.ActionQueue.BeforeTransactionCompletionProcessQueue.BeforeTransactionCompletion()中

非常感谢您的帮助。

如果您开始在非空数据库上使用Envers,则需要在审核表中手动插入当前数据

阅读更多

cfg.SetEnversProperty(ConfigurationKey.AuditStrategy, typeof(NHibernate.Envers.Strategy.ValidityAuditStrategy));
ERROR NHibernate.AssertionFailure - An AssertionFailure occurred - this may indicate a bug in NHibernate or in your custom types.
System.InvalidOperationException: Cannot find previous revision for entity NhDoodling.Entities.Domain.CompanyAddressTb_AUD and id 12962904
   at NHibernate.Envers.Strategy.ValidityAuditStrategy.updateLastRevision(ISession session, AuditConfiguration auditCfg, IList l, Object id, String auditedEntityName, Object revision, Boolean throwIfNotOneEntry)
   at NHibernate.Envers.Strategy.ValidityAuditStrategy.Perform(ISession session, String entityName, Object id, Object data, Object revision)
   at NHibernate.Envers.Synchronization.Work.AbstractAuditWorkUnit.Perform(ISession session, Object revisionData)
   at NHibernate.Envers.Synchronization.AuditProcess.executeInSession(ISession executeSession)
   at NHibernate.Envers.Synchronization.AuditProcess.DoBeforeTransactionCompletion()
   at NHibernate.Envers.Synchronization.AuditProcessManager.<>c__DisplayClass4.<Get>b__0()
   at NHibernate.Engine.ActionQueue.BeforeTransactionCompletionProcessQueue.BeforeTransactionCompletion()