开发者

Why does NHibernate set the property values of a saved object, the term used is substitute?

I use NHibernate as my DAL. My objects are versioned. I have noticed that when I save an object, NHibernate sets the mapped properties again. It all starts in the AbstractSaveEventListener.PerformSaveOrReplicate method, which decides to "substitute" the values.

Anyway, here is the stack trace:

NHibernate.dll!NHibernate.LoadPropertyAccessor.LoadPropSetter.Set(object target = {Shunra.Infra.DummyEntity.DummyEntity`1[Tag_xxSxTruexxx] #b207b57a-d510-47a7-8a1a-b48fecddbd3c (N_943918828)}, object value = "N_943918828") Line 101 C#
NHibernate.dll!NHibernate.Bytecode.Lightweight.AccessOptimizer.OnSetterCallback(object target = {Shunra.Infra.DummyEntity.DummyEntity`1[Tag_xxSxTruexxx] #b207b57a-d510-47a7-8a1a-b48fecddbd3c (N_943918828)}, int i = 1, object value = "N_943918828") Line 42 + 0x29 bytes C#
[Lightweight Function] 
NHibernate.dll!NHibernate.Bytecode.Lightweight.AccessOptimizer.SetPropertyValues(object target = {Shunra.Infra.DummyEntity.DummyEntity`1[Tag_xxSxTruexxx] #b207b57a-d510-47a7-8a1a-b48fecddbd3c (N_943918828)}, object[] values = {object[6]}) Line 32 + 0x20 bytes C#
NHibernate.dll!NHibernate.Tuple.Entity.PocoEntityTuplizer.SetPropertyValuesWithOptimizer(object entity = {Shunra.Infra.DummyEntity.DummyEntity`1[Tag_xxSxTruexxx] #b207b57a-d510-47a7-8a1a-b48fecddbd3c (N_943918828)}, object[] values = {object[6]}) Line 292 + 0x1e bytes C#
NHibernate.dll!NHibernate.Tuple.Entity.PocoEntityTuplizer.SetPropertyValues(object entity = {Shunra.Infra.DummyEntity.DummyEntity`1[Tag_xxSxTruexxx] #b207b57a-d510-47a7-8a1a-b48fecddbd3c (N_943918828)}, object[] values = {object[6]}) Line 280 + 0xe bytes C#
NHibernate.dll!NHibernate.Persister.Entity.AbstractEntityPersister.SetPropertyValues(object obj = {Shunra.Infra.DummyEntity.DummyEntity`1[Tag_xxSxTruexxx] #b207b57a-d510-47a7-8a1a-b48fecddbd3c (N_943918828)}, object[] values = {object[6]}, NHibernate.EntityMode entityMode = Poco) Line 3776 + 0x1d bytes C#
NHibernate.dll!NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate(object entity = {Shunra.Infra.DummyEntity.DummyEntity`1[Tag_xxSxTruexxx] #b207b57a-d510-47a7-8a1a-b48fecddbd3c (N_943918828)}, NHibernate.Engine.EntityKey key = {EntityKey[Dummy_xxSxTruexxx#b207b57a-d510-47a7-8a1a-b48fecddbd3c]}, NHibernate.Persister.Entity.IEntityPersister persister = {SingleTableEntityPersister(Dummy_xxSxTruexxx)}, bool useIdentityColumn = false, object anything = null, NHibernate.Event.IEventSource source = {NHibernate.Impl.SessionImpl}, bool requiresImmediateIdAccess = true) Line 245 + 0x48 bytes C#
NHibernate.dll!NHibernate.Event.Default.AbstractSaveEventListener.PerformSave(object entity = {Shunra.Infra.DummyEntity.DummyEntity`1[Tag_xxSxTruexxx] #b207b57a-d510-47a7-8a1a-b48fecddbd3c (N_943918828)}, object id = "b207b57a-d510-47a7-8a1a-b48fecddbd3c", NHibernate.Persister.Entity.IEntityPersister persister = {SingleTableEntityPersister(Dummy_xxSxTruexxx)}, bool useIdentityColumn = false, object anything = null, NHibernate.Event.IEventSource source = {NHibernate.Impl.SessionImpl}, bool requiresImmediateIdAccess = true) Line 187 + 0x21 bytes C#
NHibernate.dll!NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(object entity = {Shunra.Infra.DummyEntity.DummyEntity`1[Tag_xxSxTruexxx] #b207b57a-d510-47a7-8a1a-b48fecddbd3c (N_943918828)}, string entityName = null, object anything = null, NHibernate.Event.IEventSource source = {NHibernate.Impl.SessionImpl}, bool requiresImmediateIdAccess = true) Line 129 + 0x1b bytes C#
NHibernate.dll!NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(NHibernate.Event.SaveOrUpdateEvent event = {NHibernate.Event.SaveOrUpdateEvent}) Line 162 + 0x48 bytes C#
NHibernate.dll!NHibernate.Event.Default.DefaultSaveEventListener.SaveWithGeneratedOrRequestedId(NHibernate.Event.SaveOrUpdateEvent event = {NHibernate.Event.SaveOrUpdateEvent}) Line 29 + 0xb bytes C#
NHibernate.dll!NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient(NHibernate.Event.SaveOrUpdateEvent event = {NHibernate.Event.SaveOrUpdateEvent}) Line 148 + 0xe bytes C#
NHibernate.dll!NHibernate.Event.Default.DefaultSaveEventListener.PerformSaveOrUpdate(NHibernate.Event.SaveOrUpdateEvent event = {NHibernate.Event.SaveOrUpdateEvent}) Line 21 + 0xe bytes C#
NHibernate.dll!NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(NHibernate.Event.SaveOrUpdateEvent event = {NHibernate.Event.SaveOrUpdateEvent}) Line 53 + 0x14 bytes C#
NHibernate.dll!NHibernate.Impl.SessionImpl.FireSave(NHibernate.Event.SaveOrUpdateEvent event 开发者_如何学Go= {NHibernate.Event.SaveOrUpdateEvent}) Line 2629 + 0x1d bytes C#
NHibernate.dll!NHibernate.Impl.SessionImpl.Save(object obj = {Shunra.Infra.DummyEntity.DummyEntity`1[Tag_xxSxTruexxx] #b207b57a-d510-47a7-8a1a-b48fecddbd3c (N_943918828)}) Line 470 + 0x28 bytes C#

Where LoadPropertyAccessor is our custom property setter (we are using CSLA business objects underneath our infrastructure, so we needed NHibernate to invoke LoadProperty method when setting properties, hence the use of our custom property setter).

Anyway, all the properties have the correct values and still they are being set again. I was wondering why?

The mapping for the entity is this:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true">
  <class name="Shunra.Infra.DummyEntity.DummyEntity`1[[Tag_xxSxTruexxx, Shunra.Tags, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]],Shunra.Infra.DummyEntity"
         lazy="false" table="Dummy" entity-name="Dummy_xxSxTruexxx">
    <id name="Id" column="IdConstant" type="string">
      <generator class="assigned" />
    </id>
    <version name="m_lastChanged" column="LastChanged" access="field" generated="never" type="int" />
    <property name="Name" access="cslaloadprop" column="Name" type="string" />
    <property name="LinkReference" access="cslaloadprop" column="LinkReference" type="string" />
    <property name="LinkValue" access="cslaloadprop" column="LinkValue" type="string" />
    <property name="TypeName" column="Type" access="property" type="string" />
    <component name="ParentId" class="Shunra.Infra.Contract.EntityId,Shunra.Infra.Contract">
      <property name="IdAsDBValue" access="property" type="string" column="ParentId" />
      <property name="TypeAsDBValue" access="property" type="string" column="ParentType" />
    </component>
  </class>
</hibernate-mapping>
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜