This group and the overall project is in much better shape today, than
it was just a year ago.

The error seems to be due to a malfunctioning projection, and is most
likely a bug in the Linq provider. It would be most helpful if you
could create a test case (the generated Linq expression is probably a
sufficient starting point) and file a JIRA report.



2012/12/10 Paul Brousseau <[email protected]>:
> Hello Mattias!
>
> Unfortunately, no, I never resolved the problem.  And given the lack of
> response in this Google Group, I threw nHibernate out the window and used a
> different framework instead.  As I recall, the problem existed some time ago
> when I found it, and I'm pretty disappointed in the nHibernate project to
> find that, a full year later, the problem still exists.
>
> Sorry I couldn't be of any help.  :(
>
>
> On Monday, December 10, 2012 12:51:21 AM UTC-8, scim wrote:
>>
>> 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/-/_HXMaOXs88sJ.
>
> 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.

-- 
You received this message because you are subscribed to the Google Groups 
"nhusers" 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/nhusers?hl=en.

Reply via email to