2015-10-26 2 views
0

Я имею следующую конфигурацию, чтобы установить NH и Envers до:NHibernate Envers ValidityAuditStrategy - что я делаю неправильно?

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

Если я уеду выключить

cfg.SetEnversProperty(ConfigurationKey.AuditStrategy, typeof(NHibernate.Envers.Strategy.ValidityAuditStrategy)); 

он отлично работает, но с этим вариантом я получаю следующее исключение, когда я совершаю мой транзакция (которая обновляет объект CompanyAddressTb):

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() 

Любая помощь будет принята с благодарностью.

ответ

0

Если вы начинаете использовать Envers на непустой db, вам необходимо вручную вставить текущие данные в таблицы аудита.

Подробнее here.

Смежные вопросы