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.

Reply via email to