Hi
I am migrating my project to nhibernate 2.0, In 2.0 my code is breaking when I save an object using differnt session
This is code from unit test case which works fine with older version of nhibernate but breaks in 2.0
Code:
ISession sessionOne = new SessionManager().GetNewSession();
IEventLogger logger = EventLoggerFactory.CreateDefaultInstance();
var currencyHelperOne = new CurrencyHelper(sessionOne, logger);
var accountOne = new Account
{
Code = "TEST_AC_1",
Currency = currencyHelperOne.GetByIsoCode(Currency.KnownIsoCodes.US_DOLLAR),
Name = "TEST_AC_1",
ShortName = "TEST_AC_1",
Status = AccountStatus.KnownValues.ACTIVE(sessionOne),
Type = AccountType.KnownValues.MAP_FUND(sessionOne)
};
sessionOne.Save(accountOne);
sessionOne.Flush();
sessionOne.Evict(accountOne);
ISession sessionTwo = new SessionManager().GetNewSession();
Account accountTwo = (Account)sessionTwo.SaveOrUpdateCopy(accountOne);
here the line
Account accountTwo = (Account)sessionTwo.SaveOrUpdateCopythrows an exception
Quote:
Error 23 TestCase 'MerrillLynch.AIPlatform.Testing.DomainModel.NHibernateSessionMobilityTest.SessionInteractionTest3'
failed: NHibernate.StaleObjectStateException : Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [MerrillLynch.AIPlatform.Business.Holdings.Account#242]
at NHibernate.Event.Default.DefaultMergeEventListener.EntityIsDetached(MergeEvent event, IDictionary copyCache)
at NHibernate.Event.Default.DefaultMergeEventListener.OnMerge(MergeEvent event, IDictionary copyCache)
at NHibernate.Event.Default.DefaultMergeEventListener.OnMerge(MergeEvent event)
at NHibernate.Impl.SessionImpl.FireSaveOrUpdateCopy(MergeEvent event)
at NHibernate.Impl.SessionImpl.SaveOrUpdateCopy(Object obj)
at MerrillLynch.AIPlatform.Testing.DomainModel.NHibernateSessionMobilityTest.SessionInteractionTest3() in C:\Working\AIP_NHibernate_Migration\nhibernate_2.0_migration\MerrillLynch.AIPlatform.DomainModel.Test\NHibernateSessionMobilityTest.cs:line 43 C:\Working\AIP_NHibernate_Migration\nhibernate_2.0_migration\MerrillLynch.AIPlatform.DomainModel.Test\NHibernateSessionMobilityTest.cs 43
here is the mapping file for account class
Code:
[<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="MerrillLynch.AIPlatform.DomainModel" namespace="MerrillLynch.AIPlatform.Business.Holdings">
<class name="Account" table="account">
<id name="Id" column="id" type="Int32">
<generator class="identity" />
</id>
<version name="Timestamp" column="timestamp"
type="MerrillLynch.AIPlatform.Utilities.SqlTimestampType, MerrillLynch.AIPlatform.Utilities.Common"
generated="always" />
<property name="Code" column="code" type="String" length="30" not-null="true" />
<property name="Name" column="name" type="String" length="100" not-null="true" />
<property name="ShortName" column="short_name" type="String" length="30" not-null="true" />
<property name="FirstTradingDate" column="first_trading_date" type="DateTime" not-null="false" />
<property name="LastTradingDate" column="last_trading_date" type="DateTime" not-null="false" />
<property name="LastUpdated" column="last_updated" type="DateTime" not-null="true" />
<property name="LastUpdatedBy" column="last_updated_by" type="String" length="100" not-null="true" />
<many-to-one name="Parent" class="Account" column="parent_account_id" not-null="false" />
<many-to-one name="Status" class="AccountStatus" column="account_status_id" not-null="true" />
<many-to-one name="Type" class="AccountType" column="account_type_id" not-null="true" />
<many-to-one name="Currency" class="MerrillLynch.AIPlatform.Business.Common.Currency" column="currency_id" not-null="true" />
<many-to-one name="ComplianceReport" class="MerrillLynch.AIPlatform.Business.Risk.ComplianceReport" column="compliance_report_id" not-null="false" />
<set name="MutableGroupings" table="account_account_grouping" inverse="false" lazy="true">
<key column="account_id" />
<many-to-many class="AccountGrouping" column="account_grouping_id" />
</set>
<set name="MutableRoles" table="account_role" inverse="false" lazy="true">
<key column="account_id" />
<many-to-many class="MerrillLynch.AIPlatform.Business.Common.Role" column="role_id" />
</set>
<set name="RiskExtractTemplates" inverse="false" lazy="true">
<key column="account_id" />
<one-to-many class="MerrillLynch.AIPlatform.Business.Risk.RiskExtractTemplate" />
</set>
</class>
</hibernate-mapping>