May be you have to know that you can implements your own type for the
version property following the rules of your legacy DB.

--
Fabio Maulo


El 10/11/2010, a las 20:04, Mike Pontillo <[email protected]> escribió:

> In case anyone was wondering,
>
>   I figured out the problem. I am trying to map a legacy database
> that uses version columns that are nullable. NHibernate threw
> exceptions when I defined the nullable types in my POCOs and the
> NHibernate XML (even though the manual stated that they were supported
> -- so likely a bug) so I defined them as "int". However, I didn't
> notice that some rows (very few - likely mistakes, or cases where
> someone hand-edited the data) in the database indeed have NULL values
> for the version column. If a query ever cached one of these NULL
> values, and NHibernate subsequently performed a dirty check, it will
> throw this exception.
>
>   If I have time, I'll write up a test case and try patching the code
> so NHibernate supports nullable version columns better. I think if
> NHibernate treated NULL version columns as if they had the value 0,
> this would fix the problem.
>
> Regards,
> Mike
>
> On Tue, Nov 9, 2010 at 5:30 PM, Mike Pontillo <[email protected]> wrote:
>> Greetings,
>>
>>   I am using NHibernate 3.0.0 beta 2, and am trying to evolve some
>> prototype code that was using the "session per call" anti-pattern to
>> use a "session per request" approach. I soon noticed that after
>> implementing the session sharing, my unit tests started failing with
>> the following exception:
>>
>> System.NullReferenceException : Object reference not set to an
>> instance of an object.
>> at NHibernate.Type.Int32Type.Next(Object current, ISessionImplementor
>> session) in d:\CSharp\NH\nhibernate\src\NHibernate\Type\Int32Type.cs:
>> line 77
>> at NHibernate.Engine.Versioning.Increment(Object version, IVersionType
>> versionType, ISessionImplementor session) in d:\CSharp\NH\nhibernate
>> \src\NHibernate\Engine\Versioning.cs: line 31
>> at
>> NHibernate.Event.Default.DefaultFlushEntityEventListener.GetNextVersion(FlushEntityEvent
>> event) in d:\CSharp\NH\nhibernate\src\NHibernate\Event\Default
>> \DefaultFlushEntityEventListener.cs: line 331
>> at
>> NHibernate.Event.Default.DefaultFlushEntityEventListener.ScheduleUpdate(FlushEntityEvent
>> event) in d:\CSharp\NH\nhibernate\src\NHibernate\Event\Default
>> \DefaultFlushEntityEventListener.cs: line 242
>> at
>> NHibernate.Event.Default.DefaultFlushEntityEventListener.OnFlushEntity(FlushEntityEvent
>> event) in d:\CSharp\NH\nhibernate\src\NHibernate\Event\Default
>> \DefaultFlushEntityEventListener.cs: line 45
>> at
>> NHibernate.Event.Default.AbstractFlushingEventListener.FlushEntities(FlushEvent
>> event) in d:\CSharp\NH\nhibernate\src\NHibernate\Event\Default
>> \AbstractFlushingEventListener.cs: line 161
>> at
>> NHibernate.Event.Default.AbstractFlushingEventListener.FlushEverythingToExecutions(FlushEvent
>> event) in d:\CSharp\NH\nhibernate\src\NHibernate\Event\Default
>> \AbstractFlushingEventListener.cs: line 60
>> at
>> NHibernate.Event.Default.DefaultDirtyCheckEventListener.OnDirtyCheck(DirtyCheckEvent
>> event) in d:\CSharp\NH\nhibernate\src\NHibernate\Event\Default
>> \DefaultDirtyCheckEventListener.cs: line 21
>> at NHibernate.Impl.SessionImpl.IsDirty() in d:\CSharp\NH\nhibernate\src
>> \NHibernate\Impl\SessionImpl.cs: line 1510
>>
>>   The failures happened at "random" times, such as when I was about
>> to execute a query and NHibernate would do a dirty check. So I added
>> asserts for session.IsDirty() to try to catch the problem earlier, but
>> I still don't see an obvious cause. The odd thing is, the version
>> property should not be incrementing, since I am only doing read-only
>> work within the session so far. For example, the following code fails:
>>
>>
>> Assert.IsFalse(session.IsDirty());
>>            var query = session.CreateQuery("from " + typeof(T).Name);
>>            var list = query.List<T>();
>>            Console.WriteLine(" HQL query: {0} " + typeof(T).Name + "
>> objects found", list.Count());
>>            Assert.AreEqual(_rowCount, list.Count()); // value cached
>> in test setup
>>            Assert.IsFalse(session.IsDirty());
>>
>>   I have been looking at this all afternoon, and tried to recreate
>> the problem by pasting similar unit test code into the
>> NHibernate.Test.VersionTest unit tests. (No luck yet.) Also, I tried
>> doing a "session.Clear()" before running this code, (which I thought
>> might solve the problem if there was stale data in the session) but it
>> had no effect.
>>
>>   I'm running out of ideas... does anyone have any thoughts on what
>> to look at next?
>>
>> Thanks,
>> Mike
>
> --
> You received this message because you are subscribed to the Google Groups 
> "nhusers" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to 
> [email protected].
> For more options, visit this group at 
> http://groups.google.com/group/nhusers?hl=en.
>

-- 
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/nhusers?hl=en.

Reply via email to