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