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