|
From: NHibernate J. <mik...@us...> - 2007-01-11 05:39:32
|
[ http://jira.nhibernate.org/browse/NH-716?page=all ] Sergey Koshcheyev reopened NH-716: ---------------------------------- Reopening to fix in 1.0.4 > Dirty Checking exception (many-to-one, select-before-update) > ------------------------------------------------------------ > > Key: NH-716 > URL: http://jira.nhibernate.org/browse/NH-716 > Project: NHibernate > Type: Bug > Components: Core > Versions: 1.2.0.Alpha1 > Reporter: Sasha Borodin > Fix For: 1.0.4, 1.2.0.Beta2 > > This problem can be reproduced by flushing a session with an entity which contains a "many-to-one" property, but only when the "select-before-update" option is turned on for that class (and performed). > The problem occurs during the "dirty checking", in the EntityType.GetIdentifier. This is because that method is called on a variable which is already a String identifier itself, in ManyToOneType.IsModified. And i believe that THIS is because the "old" and "current" parameters passed to this class by TypeFactory.FindModified are reversed ("x" and "y"), so that EntityType.GetIdentifier is attempting to resolve the id on the wrong variable. > Full stack trace of any exception that occurs: > NHibernate.MappingException was unhandled by user code > Message="Unknown entity class: System.String" > Source="NHibernate" > StackTrace: > at NHibernate.Impl.SessionFactoryImpl.GetEntityPersister(Type theClass) in c:\net\nhibernate\nhibernate\src\NHibernate\Impl\SessionFactoryImpl.cs:line 563 > at NHibernate.Impl.SessionImpl.GetClassPersister(Type theClass) in c:\net\nhibernate\nhibernate\src\NHibernate\Impl\SessionImpl.cs:line 3489 > at NHibernate.Impl.SessionImpl.GetEntityPersister(Object obj) in c:\net\nhibernate\nhibernate\src\NHibernate\Impl\SessionImpl.cs:line 3497 > at NHibernate.Impl.SessionImpl.GetEntityIdentifierIfNotUnsaved(Object obj) in c:\net\nhibernate\nhibernate\src\NHibernate\Impl\SessionImpl.cs:line 3613 > at NHibernate.Type.EntityType.GetIdentifier(Object value, ISessionImplementor session) in c:\net\nhibernate\nhibernate\src\NHibernate\Type\EntityType.cs:line 60 > at NHibernate.Type.ManyToOneType.IsModified(Object old, Object current, Boolean[] checkable, ISessionImplementor session) in c:\net\nhibernate\nhibernate\src\NHibernate\Type\ManyToOneType.cs:line 112 > at NHibernate.Type.TypeFactory.FindModified(StandardProperty[] properties, Object[] x, Object[] y, Boolean[][] includeColumns, Boolean anyUninitializedProperties, ISessionImplementor session) in c:\net\nhibernate\nhibernate\src\NHibernate\Type\TypeFactory.cs:line 988 > at NHibernate.Persister.Entity.AbstractEntityPersister.FindModified(Object[] old, Object[] current, Object obj, ISessionImplementor session) in c:\net\nhibernate\nhibernate\src\NHibernate\Persister\Entity\AbstractEntityPersister.cs:line 311 > at NHibernate.Impl.SessionImpl.FlushEntity(Object obj, EntityEntry entry) in c:\net\nhibernate\nhibernate\src\NHibernate\Impl\SessionImpl.cs:line 3263 > at NHibernate.Impl.SessionImpl.FlushEntities() in c:\net\nhibernate\nhibernate\src\NHibernate\Impl\SessionImpl.cs:line 3200 > at NHibernate.Impl.SessionImpl.FlushEverything() in c:\net\nhibernate\nhibernate\src\NHibernate\Impl\SessionImpl.cs:line 2953 > at NHibernate.Impl.SessionImpl.Flush() in c:\net\nhibernate\nhibernate\src\NHibernate\Impl\SessionImpl.cs:line 2929 > at NHibernate.Transaction.AdoTransaction.Commit() in c:\net\nhibernate\nhibernate\src\NHibernate\Transaction\AdoTransaction.cs:line 141 > at DFWHC.GroupOne.GoRes.business.DivisionFactory.UpdateDivision(Division division) in C:\Development\dfw_hospital\GroupOne\GoRes\library\business\DivisionFactory.cs:line 72 > at EditDivision.Update(Object src, EventArgs args) in c:\Development\dfw_hospital\GroupOne\GoRes\website\user\employee\admin\EditDivision.aspx.cs:line 135 > at System.Web.UI.WebControls.Button.OnClick(EventArgs e) > at System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) > at System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) > at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) > at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) > at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) > I think that I was able to solve the issue by making a small change in TypeFactory.FindModified(), line 991. By reordering the parameters correctly in TypeFactory.FindModified (swapping "x" and "y" around), the framework now resolves the id of the correct (entity) variable. But I am not familiar with the process of creating a patch. > Thank you for looking into this. -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://jira.nhibernate.org/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira |