在nhibernate中跟踪对象

时间:2012-08-09 13:54:31

标签: nhibernate change-tracking

美好的一天 我在一个项目的对象变更跟踪子系统上工作 - 当对象被更改时,我们必须写日期,做出更改的人和更改(DELETE,CREATE,UPDATE with new and new state)

我创建了以下方案: -Repository.Save(object)将对象推送到ITrackService.UpdatedObjects -in PreInsertListener我在ITrackService.UpdatedObjects中搜索event.Entity(通过属性进行深度搜索)。 例如: 我们有

class Client 
{
   public Country Country {get; set;}
   ...
}

class Country
{
   public string Name {get; set;}
   ...
}

我们更新客户国家,但保存客户对象(不是国家/地区)。我们在ITrackService.UpdatedObjects中有Client对象,但在监听器中我们有Country。通过深度搜索,我有父对象(客户端),并且可以记录此操作

这项工作很好

第二个例子:

class Client
{
   public ICollection<string> Notes {get;set;}
   ...
}

Client.Notes.Add("new note");

然后我遍历Client属性我找到了Notes集合,但是这个集合没有初始化(由NHibernateUtil.IsInitialized检查),如果我尝试在flush上初始化它捕获异常:对象引用未设置为对象的实例跟踪堆栈跟踪: 在

NHibernate.Collection.AbstractPersistentCollection.AdditionEnumerable.AdditionEnumerator.MoveNext()
   at NHibernate.Engine.Cascade.CascadeCollectionElements(Object child, CollectionType collectionType, CascadeStyle style, IType elemType, Object anything, Boolean isCascadeDeleteEnabled)
   at NHibernate.Engine.Cascade.CascadeCollection(Object child, CascadeStyle style, Object anything, CollectionType type)
   at NHibernate.Engine.Cascade.CascadeAssociation(Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled)
   at NHibernate.Engine.Cascade.CascadeProperty(Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled)
   at NHibernate.Engine.Cascade.CascadeOn(IEntityPersister persister, Object parent, Object anything)
   at NHibernate.Event.Default.AbstractFlushingEventListener.CascadeOnFlush(IEventSource session, IEntityPersister persister, Object key, Object anything)
   at NHibernate.Event.Default.AbstractFlushingEventListener.PrepareEntityFlushes(IEventSource session)
   at NHibernate.Event.Default.AbstractFlushingEventListener.FlushEverythingToExecutions(FlushEvent event)
   at NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent event)
   at Sonne.App.Services.Logging.DomainObjectListener.OnFlush(FlushEvent event) in D:\Projects\Current\Singularis\VanSoft\src\Sonne.App\Services\Logging\DomainObjectListener.cs:line 166
   at NHibernate.Impl.SessionImpl.Flush()
   at NHibernate.Transaction.AdoNetWithDistributedTransactionFactory.DistributedTransactionContext.System.Transactions.IEnlistmentNotification.Prepare(PreparingEnlistment preparingEnlistment)

有人知道这方面的解决方案吗?

0 个答案:

没有答案