Please open an issue at Donjon, preferably with a patch.

-Markus

2009/10/13 Mike Christensen <[email protected]>

>
> One quick question.  Why do I need to do:
>
> [Property(NotNull = true, ColumnType = "Website.Price, Website")]
> public Price VendorFees {get; set;}
>
> Shouldn't it know the ColumnType is Price, just as it would know the
> column type for Int32 or Boolean?  Having to specify the ColumnType in
> the property tag seems a bit redundant.  Thanks!
>
> Mike
>
> On Mon, Oct 12, 2009 at 5:31 PM, Mike Christensen <[email protected]>
> wrote:
> > Got it.. (BTW, I was referring to the JavascriptSerializer - perhaps
> > the XmlSerializer is smarter)..
> >
> > You just have to mark the extra stuff with ScriptIgnore, such as this:
> >
> > [ScriptIgnore]
> > public Type ReturnedType
> > {
> >   get { return typeof(Price); }
> > }
> >
> > Everything is working awesome now!!!
> >
> > Thanks all,
> > Mike
> >
> > On Mon, Oct 12, 2009 at 5:17 PM, G. Richard Bellamy
> > <[email protected]> wrote:
> >> That doesn't sound right... I've serialized IUserType before. Let me try
> to
> >> find a sample...
> >>
> >> On Mon, Oct 12, 2009 at 5:15 PM, Mike Christensen <[email protected]>
> >> wrote:
> >>>
> >>> Hi -
> >>>
> >>> The IUserType approach almost works, however I need to mark my type as
> >>> [Serializable] which the implementation for IUserType does not allow
> >>> for..  You'll get a circular reference detected when serializing the
> >>> getters..
> >>>
> >>> Guess it's back to the drawing board..
> >>>
> >>> Mike
> >>>
> >>> On Mon, Oct 12, 2009 at 2:17 PM, Mike Christensen <[email protected]>
> >>> wrote:
> >>> > Hi - The URL you mentioned only seems to contain information about
> >>> > persisting enums as strings, which is great since I was wondering
> >>> > about that as well (as PostgreSQL users string for enums)..
> >>> >
> >>> > Can you point me to any relevant information about IUserType and how
> >>> > to create a user defined type that persists in the DB (as an integer,
> >>> > rather than serialized byte array)?  Thanks!
> >>> >
> >>> > Mike
> >>> >
> >>> > On Mon, Oct 12, 2009 at 1:23 PM, Mauricio Scheffer
> >>> > <[email protected]> wrote:
> >>> >>
> >>> >> First, consider using System.Decimal instead of your own Price
> class.
> >>> >> If you still need some special feature and absolutely need your own
> >>> >> Price class, write a NHibernate IUserType. Here are some sample user
> >>> >> types: http://nhforge.org/wikis/howtonh/tags/IUserType/default.aspx
> >>> >>
> >>> >> On Oct 12, 5:14 pm, Mike Christensen <[email protected]> wrote:
> >>> >>> Hi guys - I've been struggling with this one for a while, the
> scenario
> >>> >>> seems very basic but I've spent several hours on this and run into
> >>> >>> what seems like NHibernate bugs..
> >>> >>>
> >>> >>> Here's the situation.  I have a class called "Price" which is
> >>> >>> implemented like this:
> >>> >>>
> >>> >>>   [Serializable]
> >>> >>>   public class Price : IComparable, IFormattable, IComparable<int>,
> >>> >>> IEquatable<int>
> >>> >>>   {
> >>> >>>      public static implicit operator Price(int cents);
> >>> >>>      public static implicit operator int(Price price);
> >>> >>>      public static bool operator ==(Price x, Price y);
> >>> >>>      public static bool operator !=(Price x, Price y);
> >>> >>>      public int CompareTo(object obj);
> >>> >>>      public int CompareTo(int other);
> >>> >>>      public bool Equals(int other);
> >>> >>>    }
> >>> >>>
> >>> >>> As you can see, the compiler will treat Price exactly like an
> >>> >>> integer.  I can say:
> >>> >>>
> >>> >>> Price p = 500; //p is $5.00
> >>> >>>
> >>> >>> ...as well as compare a Price object to other Price objects or to
> >>> >>> ints.
> >>> >>>
> >>> >>> In ActiveRecord, I'd like to have this:
> >>> >>>
> >>> >>>      [Property(NotNull = true, ColumnType = "Int32")]
> >>> >>>      public Price VendorFees
> >>> >>>      {
> >>> >>>         get { return vendorfees; }
> >>> >>>         set { vendorfees = value; }
> >>> >>>      }
> >>> >>>
> >>> >>> This seems simple enough, and actually the above code works when
> you
> >>> >>> Create or Update a record, however it causes an exception when you
> >>> >>> load.  Under the covers, this appears to be an NHibernate bug.
>  When
> >>> >>> NHibernate hydrates an object, in ReflectionOptimizer.cs there's a
> >>> >>> function called GenerateSetPropertyValuesMethod.  This method
> actually
> >>> >>> builds IL code (pretty slick) which will loop through the value
> array
> >>> >>> from the database and set it to the appropriate setters on the
> >>> >>> object.  However, there's a bug in this code that assumes the DB
> type
> >>> >>> and the "setter" type are exactly the same.  The setter is never
> even
> >>> >>> called on my object, I just get an exception that says "Cannot cast
> >>> >>> Website.Price to System.Int32" (which happens when the IL code is
> >>> >>> invoked)..  So in my opinion, that's an NHibernate bug however I
> don't
> >>> >>> see them fixing this.
> >>> >>>
> >>> >>> The work-around I'm exploring is to get NHibernate to hydrate this
> >>> >>> column as a "Price" in the first place.  The method I'm trying to
> use
> >>> >>> would be to do something like this:
> >>> >>>
> >>> >>>      [Property(NotNull = true, ColumnType =
> "Website.Price,Website",
> >>> >>> SqlType = "integer")]
> >>> >>>      public Price VendorFees
> >>> >>>      {
> >>> >>>         get { return vendorfees; }
> >>> >>>         set { vendorfees = value; }
> >>> >>>      }
> >>> >>>
> >>> >>> I believe this would work, however, Active Record appears to
> configure
> >>> >>> this column as a serializable type and wants to map it to a byte
> array
> >>> >>> in the DB.  When AR is building the Insert command, I get an
> exception
> >>> >>> saying the parameter type was bytea but the data was an integer.
> >>> >>>
> >>> >>> Can anyone point me in the right direction?  I'm totally lost on
> this
> >>> >>> one.  Thanks!!
> >>> >>>
> >>> >>> Mike
> >>> >> >>
> >>> >>
> >>> >
> >>>
> >>>
> >>
> >>
> >> >>
> >>
> >
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Castle Project Users" 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/castle-project-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to