Hi, Paul!
I have the exact same problem as you when trying to execute a similar query
over odata. Have you managed to resolve the issue yet?
I've narrowed it down to the same line of code as you, ie when it tries to
transform the query to an ExpandedWrapper. Nhibernate tries to transform
pairs of (in your case) Widget/Designer, however the Widgets-property of
Designers expects an List of Widgets and not multiple instance of the
Widget.
Thanks in advance,
Mattias
Den fredagen den 16:e december 2011 kl. 21:12:26 UTC+1 skrev Paul:
>
> I'm pretty new to nHibernate, so I'm most likely doing something very
> dumb. I am using nHibernate 3.2 GA. I have two objects, "Widget" and
> "Designers". A widget knows its designer, and it has only one
> designer. A designer has many widgets, and it know of all of them.
> Thus, these entities:
>
> public class WidgetEntity
> {
> public virtual Guid Id { get; set; }
> public virtual DesignerEntity Designer { get; set; }
> }
>
> public class DesignerEntity
> {
> public virtual Guid Id { get; set; }
> public virtual string Name { get; set; }
> public virtual string Address { get; set; }
>
> public virtual ICollection<WidgetEntity> Widgets { get; set; }
> }
>
> I've created the following two mappings:
>
> <hibernate-mapping xmlns='urn:nhibernate-mapping-2.2'
> assembly='ODataTest' namespace='ODataTest' >
> <class name='WidgetEntity' table='WidgetEntity' >
> <id name='Id' column='Id' >
> <generator class='guid.comb' />
> </id>
> <many-to-one name='Designer' class='DesignerEntity'
> column='DesignerId' foreign-key='FK_DESIGNER_WIDGETS' cascade='save-
> update' />
> </class>
> </hibernate-mapping>
>
> <hibernate-mapping xmlns='urn:nhibernate-mapping-2.2'
> assembly='ODataTest' namespace='ODataTest'>
> <class name='DesignerEntity' table='DesignerEntity'>
> <id name='Id' column='Id'>
> <generator class='guid.comb' />
> </id>
> <set lazy='true' name='Widgets' inverse='true'>
> <key column='DesignerId' />
> <one-to-many class='WidgetEntity' />
> </set>
> </class>
> </hibernate-mapping>
>
> Basic queries for either widgets or designers work great; no
> problems. But I am using this in context of an OData server, and so
> when I am issue a command like
> http://[SERVER]/WidgetService/Designers(guid'[ID]')/?$expand=Widgets,
> I get an exception back. OData is by-and-large hiding the nHibernate
> LINQ command, but inferring from stepping through the code, I think
> this is the exact command / expression being passed to
> DefaultQueryProvider.Execute:
>
>
> value(NHibernate.Linq.NhQueryable`1[ODataTest.DesignerEntity]).Where(element
> => (element.Id == d5e3ce36-b0d0-49e7-b104-28029ff59414)).Select(p =>
> new ExpandedWrapper`2() {ExpandedElement = p, Description = "Widgets",
> ProjectedProperty0 = p.Widgets})
>
> The resulting SQL query is this:
>
> exec sp_executesql N'select designeren0_.Id as Id1_0_, widgets1_.Id as
> Id0_1_, widgets1_.DesignerId as DesignerId0_1_ from DesignerEntity
> designeren0_ inner join WidgetEntity widgets1_ on
> designeren0_.Id=widgets1_.DesignerId where designeren0_.Id=@p0',N'@p0
> uniqueidentifier',@p0='D5E3CE36-B0D0-49E7-B104-28029FF59414'
>
> I hacked out some columns for brevity sake. My SQL server likes this
> just fine, and returns two rows. However, when attempting to
> transform the SQL result into my returned data, I get an exception.
> What it comes down to is an InvalidCastException: "Unable to cast
> object of type 'ODataTest.WidgetEntity' to type
> 'System.Collections.Generic.ICollection`1[ODataTest.WidgetEntity]'."
> The exact location is in ResultTransformer.cs, line 25:
>
> return _itemTransformation == null ? tuple :
> _itemTransformation.DynamicInvoke(new object[] {tuple});
>
> _itemTransformation is "{Method =
>
> {System.Data.Services.Internal.ExpandedWrapper`2[ODataTest.DesignerEntity,System.Collections.Generic.IEnumerable`1[ODataTest.WidgetEntity]]
> lambda_method(System.Runtime.CompilerServices.Closure,
> System.Object[])}}". tuple is an array of two objects. The first is
> my DesignerEntity, complete with Widgets ICollection filled in. The
> second is a single WidgetEntity, the values of which correlate to the
> first SQL result row.
>
> At this point, I have no idea what's going on. :) I am supposing
> that the problem is in my hbm files. I have tried setting up many-to-
> one without cascade (which, I would think, doesn't matter here since
> I'm only doing a select). I have tried setting up the one-to-many as
> a bag, and both with and without the inverse.
>
> Apologies if I'm missing some information, or this is too much
> information. Any help would be appreciated... I've been pulling my
> hair for a couple of days on this. :) Thanks!!
>
>
--
You received this message because you are subscribed to the Google Groups
"nhusers" group.
To view this discussion on the web visit
https://groups.google.com/d/msg/nhusers/-/0Cn_NzO4PZcJ.
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.