Hello open people,

I think I founded a bug in NHibernate 2.1.
Before reading that message and throwing me stones, please know that I
founded it at work and I'm pretty tired and lazy now. So if I am not
giving enough details, please don't kill me! I prefered posting
something before forgetting about it.

*** Observations ***

The bug happened when saving/loading a collection of element of
nullable .net types.
When saving a List<double?>, mapped as a list of element
(kindof this :
<list name="toto">
<key.../>
<index .../>
<element ../> <<< a 'double?'
</list>
containing {9,null, null,8,null}, NHibernate insert tuples <0,9>,
<3,8>, not inserting null values (which is great).

When loading it inserts null values into the list (cool). <<
cockroach

*** Why cockroach? ***

Here is the ReadFrom function from
NHibernate.Collection.PersistentList.cs

                public override object ReadFrom(IDataReader rs, 
ICollectionPersister
role, ICollectionAliases descriptor, object owner)
                {
                        object element = role.ReadElement(rs, owner,
descriptor.SuffixedElementAliases, Session);
                        int index = (int) role.ReadIndex(rs,
descriptor.SuffixedIndexAliases, Session);

                        //pad with nulls from the current last element up to 
the new index
                        for (int i = list.Count; i <= index; i++)
                        {
                                list.Insert(i, DefaultForType);
                        }

                        list[index] = element;
                        return element;
                }

See that line ? "list.Insert(i, DefaultForType);" Default for double?
is null. So we do have list.Insert(i,null) here. What is 'list'?

public class PersistentList : AbstractPersistentCollection, IList
        {
                protected IList list;

An IList, which is initialized in the constructor by

public PersistentList(ISessionImplementor session, IList list) : base
(session)
                {
                        this.list = list;
                        SetInitialized();
                        IsDirectlyAccessible = true;
                }

So the concrete code, in case of List<double?> is

IList list = new List<double?>();

followed by

list.Add(i,null) << an exception is thrown cuz List<double?> checks if
null is a double? and it says it is not.

Sorry for the lazy and badly written message in English. I'm a monkey,
it is difficult for us monkey to speak English.










--~--~---------~--~----~------------~-------~--~----~
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