我有一個由nhibernate 3.1開發的項目。 我需要在項目中實現併發。 我添加「版本」,以HBM文件:如何在Nhibernat 3.1中實現併發性
<class name="Person" table="Person_Person" >
<id name="Id" type="Int64" unsaved-value="0" >
<generator class="native" />
</id>
<version name="Version" />
<property name="FirstName" column="FirstName"
type="String(255)" update="true" insert="true" access="property" not-null="false" />
<property name="LastName" column="LastName"
type="String(255)" update="true" insert="true" access="property" not-null="false" />
</class>
而且我一個版本字段添加到實體:
virtual protected int Version { get; set; }
此外,我用int型版本字段添加到數據庫中。
此實現僅適用於一次。 僅當數據庫中的版本值爲'0'時才起作用。 在第一次更新表中的這一行之後,此值更改爲'1'。 但對於下一個更新版本時,字段不爲「0」,例如「1」,此消息拋出異常:
Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [RCISP.Domain.Entities.Person#4]
我應該怎麼辦?
堆棧跟蹤是:
at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Object[] oldFields, Object rowId, Boolean[] includeProperty, Int32 j, Object oldVersion, Object obj, SqlCommandInfo sql, ISessionImplementor session)
at NHibernate.Persister.Entity.AbstractEntityPersister.UpdateOrInsert(Object id, Object[] fields, Object[] oldFields, Object rowId, Boolean[] includeProperty, Int32 j, Object oldVersion, Object obj, SqlCommandInfo sql, ISessionImplementor session)
at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Int32[] dirtyFields, Boolean hasDirtyCollection, Object[] oldFields, Object oldVersion, Object obj, Object rowId, ISessionImplementor session)
at NHibernate.Action.EntityUpdateAction.Execute()
at NHibernate.Engine.ActionQueue.Execute(IExecutable executable)
at NHibernate.Engine.ActionQueue.ExecuteActions(IList list)
at NHibernate.Engine.ActionQueue.ExecuteActions()
at NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session)
at NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent event)
版本在人類單獨是正確的,但在關係之後,另一個類是問題。例如Family類的關係(一對多)。我將版本字段添加到實體類和兩個hbm文件。它是正確的? – Ehsan