Inverse(False) causes StaleObjectException on a ManyToOne relation
Description
A StaleObjectException is thrown when an object is removed from a collection with Inverse(False) and Cascade(Cascade.All).
Nhibernate is Updating the child record by setting the foreign key to null, then trying to delete the child from the table.
NHibernate: select TOP (1) valueconfi0_.Id as Id5_, valueconfi0_.Version as Version5_, valueconfi0_.ContractNo as ContractNo5_, valueconfi0_.DateToUse as DateToUse5_, valueconfi0_.RecogniseValueAt as Recognis5_5_, valueconfi0_.RecogniseApprovedAfp as Recognis6_5_, valueconfi0_.OrderValueCalculation as OrderVal7_5_, valueconfi0_.DateCreated as DateCrea8_5_, valueconfi0_.DateUpdated as DateUpda9_5_, valueconfi0_.UpdatedBy as UpdatedBy5_, valueconfi0_.CreatedBy as CreatedBy5_ from LOOKUPS.ValueConfiguration valueconfi0_ NHibernate: SELECT valuecalcu0_.ValueConfigurationId as ValueCo16_1_, valuecalcu0_.Id as Id1_, valuecalcu0_.Id as Id7_0_, valuecalcu0_.Version as Version7_0_, valuecalcu0_.Name as Name7_0_, valuecalcu0_.DateFrom as DateFrom7_0_, valuecalcu0_.BillingType as BillingT5_7_0_, valuecalcu0_.CustomerId as CustomerId7_0_, valuecalcu0_.PatchId as PatchId7_0_, valuecalcu0_.Scheme as Scheme7_0_, valuecalcu0_.JobType as JobType7_0_, valuecalcu0_.JobNumber as JobNumber7_0_, valuecalcu0_.Formula as Formula7_0_, valuecalcu0_.DateCreated as DateCre12_7_0_, valuecalcu0_.DateUpdated as DateUpd13_7_0_, valuecalcu0_.UpdatedBy as UpdatedBy7_0_, valuecalcu0_.CreatedBy as CreatedBy7_0_, valuecalcu0_.ValueConfigurationId as ValueCo16_7_0_ FROM LOOKUPS.ValueCalculation valuecalcu0_ WHERE valuecalcu0_.ValueConfigurationId=@p0;@p0 = a2cf020d-0975-40c2-bc80-4416b77723ab [Type: Guid (0)] NHibernate: SELECT valueconfi_.Version as Version5_ FROM LOOKUPS.ValueConfiguration valueconfi_ WHERE valueconfi_.Id=@p0;@p0 = a2cf020d-0975-40c2-bc80-4416b77723ab [Type: Guid (0)] NHibernate: UPDATE LOOKUPS.ValueCalculation SET ValueConfigurationId = null WHERE ValueConfigurationId = @p0;@p0 = a2cf020d-0975-40c2-bc80-4416b77723ab [Type: Guid (0)] NHibernate: DELETE FROM LOOKUPS.ValueCalculation WHERE Id = @p0 AND Version = @p1;@p0 = 793b5b63-ab49-4905-9cdb-f870d717f73c [Type: Guid (0)], @p1 = 0x000000000065F181 [Type: Binary (8000)]
Parent Config
Id(x => x.Id, m => m.Generator(Generators.Guid));
Property(x => x.ContractNo); Property(x => x.DateToUse, m => m.Type<EnumStringType<DateToUse>>()); Property(x => x.OrderValueCalculation, m => m.Type<EnumStringType<OrderValueCalculation>>()); Property(x => x.RecogniseValueAt, m => m.Type<EnumStringType<RecogniseValueAt>>()); Property(x => x.RecogniseApprovedAfp);
Set(x => x.ValueCalculations, set => { set.Key(k => k.Column("ValueConfigurationId")); set.Cascade(Cascade.All); set.Inverse(false); }, ce => ce.OneToMany());
Property(x => x.DateCreated, m => { m.Insert(false); m.Update(false); }); Property(x => x.CreatedBy, m => { m.Insert(false); m.Update(false); }); Property(x => x.DateUpdated, m => m.NotNullable(false)); Property(x => x.UpdatedBy, m => m.NotNullable(false)); Version(x => x.Version, m => { m.Generated(VersionGeneration.Always); m.Type<RowVersionType>(); });
Environment
None
Activity
Show:
Tony S
June 1, 2012 at 2:34 PM
Yep thanks, this can be closed.
Alex Zaytsev
June 1, 2012 at 1:10 PM
So, can I close the issue?
Tony S
June 1, 2012 at 1:03 PM
Thanks that sorted the problem.
Set(x => x.ValueCalculations, set => { set.Key(k => { k.Column("ValueConfigurationId"); k.NotNullable(true); }); set.Cascade(Cascade.All); set.Inverse(false); }, ce => ce.OneToMany());
It now only deletes the child, without updating the foreign key to null.
A StaleObjectException is thrown when an object is removed from a collection with Inverse(False) and Cascade(Cascade.All).
Nhibernate is Updating the child record by setting the foreign key to null, then trying to delete the child from the table.
NHibernate: select TOP (1) valueconfi0_.Id as Id5_, valueconfi0_.Version as Version5_, valueconfi0_.ContractNo as ContractNo5_, valueconfi0_.DateToUse as DateToUse5_, valueconfi0_.RecogniseValueAt as Recognis5_5_, valueconfi0_.RecogniseApprovedAfp as Recognis6_5_, valueconfi0_.OrderValueCalculation as OrderVal7_5_, valueconfi0_.DateCreated as DateCrea8_5_, valueconfi0_.DateUpdated as DateUpda9_5_, valueconfi0_.UpdatedBy as UpdatedBy5_, valueconfi0_.CreatedBy as CreatedBy5_ from LOOKUPS.ValueConfiguration valueconfi0_
NHibernate: SELECT valuecalcu0_.ValueConfigurationId as ValueCo16_1_, valuecalcu0_.Id as Id1_, valuecalcu0_.Id as Id7_0_, valuecalcu0_.Version as Version7_0_, valuecalcu0_.Name as Name7_0_, valuecalcu0_.DateFrom as DateFrom7_0_, valuecalcu0_.BillingType as BillingT5_7_0_, valuecalcu0_.CustomerId as CustomerId7_0_, valuecalcu0_.PatchId as PatchId7_0_, valuecalcu0_.Scheme as Scheme7_0_, valuecalcu0_.JobType as JobType7_0_, valuecalcu0_.JobNumber as JobNumber7_0_, valuecalcu0_.Formula as Formula7_0_, valuecalcu0_.DateCreated as DateCre12_7_0_, valuecalcu0_.DateUpdated as DateUpd13_7_0_, valuecalcu0_.UpdatedBy as UpdatedBy7_0_, valuecalcu0_.CreatedBy as CreatedBy7_0_, valuecalcu0_.ValueConfigurationId as ValueCo16_7_0_ FROM LOOKUPS.ValueCalculation valuecalcu0_ WHERE valuecalcu0_.ValueConfigurationId=@p0;@p0 = a2cf020d-0975-40c2-bc80-4416b77723ab [Type: Guid (0)]
NHibernate: SELECT valueconfi_.Version as Version5_ FROM LOOKUPS.ValueConfiguration valueconfi_ WHERE valueconfi_.Id=@p0;@p0 = a2cf020d-0975-40c2-bc80-4416b77723ab [Type: Guid (0)]
NHibernate: UPDATE LOOKUPS.ValueCalculation SET ValueConfigurationId = null WHERE ValueConfigurationId = @p0;@p0 = a2cf020d-0975-40c2-bc80-4416b77723ab [Type: Guid (0)]
NHibernate: DELETE FROM LOOKUPS.ValueCalculation WHERE Id = @p0 AND Version = @p1;@p0 = 793b5b63-ab49-4905-9cdb-f870d717f73c [Type: Guid (0)], @p1 = 0x000000000065F181 [Type: Binary (8000)]
Parent Config
Id(x => x.Id, m => m.Generator(Generators.Guid));
Property(x => x.ContractNo);
Property(x => x.DateToUse, m => m.Type<EnumStringType<DateToUse>>());
Property(x => x.OrderValueCalculation, m => m.Type<EnumStringType<OrderValueCalculation>>());
Property(x => x.RecogniseValueAt, m => m.Type<EnumStringType<RecogniseValueAt>>());
Property(x => x.RecogniseApprovedAfp);
Set(x => x.ValueCalculations, set =>
{
set.Key(k => k.Column("ValueConfigurationId"));
set.Cascade(Cascade.All);
set.Inverse(false);
},
ce => ce.OneToMany());
Property(x => x.DateCreated, m => { m.Insert(false); m.Update(false); });
Property(x => x.CreatedBy, m => { m.Insert(false); m.Update(false); });
Property(x => x.DateUpdated, m => m.NotNullable(false));
Property(x => x.UpdatedBy, m => m.NotNullable(false));
Version(x => x.Version, m => { m.Generated(VersionGeneration.Always); m.Type<RowVersionType>(); });