No problem :)

So to make it clear - you think it's not worthwhile to try to patch ReflectionOptimizer for this (uncommon, I agree) scenario, and it's better to go the IUserType/ Custom Dialect way. Is that correct?


Krzysztof

Fabio Maulo wrote:
ah... and you know which is the price our friends should pay for a support question in dev-list, no ? The price is a blog-post about the problem and the solution... even better if cross-post in nh-forge.

2009/10/7 Fabio Maulo <[email protected] <mailto:[email protected]>>

    LOL...
    have a look to the Dialect... there you can define your
default behaviour for UInt32

    2009/10/7 Krzysztof Koźmic <[email protected]
    <mailto:[email protected]>>


        Yes, you're right - I'm an idiot :)

        However with the BIGINT, I'm still getting an exception,
        although different:
        System.ArgumentException: No mapping exists from DbType UInt32
        to a known SqlDbType.
        Not sure if it's the late hour, me being an idiot again, or it
        just won't work this way.

        Fabio Maulo wrote:

            What ?
            Follow the xsd and re-read what I wrote.... <property .......>
            <column name="xxxx" sql-type="whatever"/>
            </property>

            2009/10/7 Krzysztof Koźmic <[email protected]
            <mailto:[email protected]>
            <mailto:[email protected]
            <mailto:[email protected]>>>


               Yeah, IUserType is what I ended up doing, but I
            consider this
               behavior a bug anyway.

               Fabio... I get mapping exception (on the trunk)
               "XML validation error: The 'sql-type' attribute is not
            declared."


               Ayende Rahien wrote:

                   I don't think so, at the time we create the
                adapters, we don't
                   know what the value in the DB will be.
                   This isn't actually a problem, however.
                   NHibernate may be somewhat lax about these things,
                but the proper
                   way to support such a scenario is to provide value
                conversion
                   using an IUserType

                   2009/10/7 Krzysztof Koźmic
                <[email protected]
                <mailto:[email protected]>
                   <mailto:[email protected]
                <mailto:[email protected]>>>


                       I was trying to create a patch for scenarios
                where we have
                       one numeric type of property on the model, and
                we map it to
                       different type in DB, which currently produces
                exception in
                       NHibernate.

                       In my scenario, where I stumbled upon this bug
                I had uint on
                       my model, that I wanted to map to long on a SQL
                Server
                       database (which apparently does not support
                unsigned types,
                       which is besides the point).

                       So with Entity like this:

                       public class UIntAsLong
                       {
                           private Guid Id { get; set; }
                           public virtual uint UIntProp { get; set; }
                       }

                       and mapping like this:
                       <?xml version="1.0"?>
                       <hibernate-mapping
                xmlns="urn:nhibernate-mapping-2.2"
                                          assembly="Foo"
                                          namespace="Foo">

                         <class name="UIntAsLong">
                           <id name="Id"/>
                           <property name="UIntProp" not-null="true"
                type="long"/>            </class>
                       </hibernate-mapping>

                       I'm trying to make it work.

                       The reason for the exception, is that
                NHibernate is basically
                       trying to do the following:

                       uint foo = 123u;
                       long fooLong = foo; //implicit cast
                       object fooObj = fooLong; //boxing
                       foo = (uint)fooObj; //trying to do unboxing and
                numeric
                       conversion at onece - runtime exception.

                       For this to work, instead of the last line we'd
                have to have:

                       long fooLongAgain = (long)fooLong; //unboxing
                       uint fooUint = (uint)fooLongAgain; //numeric
                conversion

                       This seemed like a trivial change, but there's
                *one piece of
                       information missing* - the ReflectionOptimizer
                class, which
                       generates the getters and setters does not know
                to what type
                       the property is being cast (the long in the
                above example).

                       Is there a way to provide it with that information?

                       Krzysztof






-- Fabio Maulo





-- Fabio Maulo




--
Fabio Maulo

Reply via email to