You don't need to apologize for asking questions, that's what the group is
for.
Anyway, it's the first time you mention you are dealing with a legacy DB.
If that's the case, yes, implicit polymorphism is your only alternative.
Regarding the "grouped by type" query, I insist: do separate queries and
join them client side.
Here's a possible implementation:
var results =
sessionFactory.GetAllClassMetadata().Where(
kvp =>
parentClass.IsAssignableFrom(kvp.Value.GetMappedClass(EntityMode.Poco)))
.Select(
kvp =>
new
{
Type =
kvp.Value.GetMappedClass(EntityMode.Poco),
Count
= session.CreateCriteria(kvp.Key)
.SetProjection(Projections.RowCount())
.UniqueResult<int>()
})
.ToList();
Diego
On Mon, May 10, 2010 at 10:25, Jon Moore <[email protected]> wrote:
> Hi Diego, thanks for your patience,
>
> From what I understand from the documentation, each of the strategies
> involve superclass persistence of some sort, even the union subclass which
> forces you to have a shared sequential key (actually stored in the concrete
> class but unique across all). I think the implicit is the only one that
> would allow us to store the concrete classes completely separate from each
> other (as we are using a legacy database) .
>
> Either way I am having all sorts of issues persisting what we have
> implemented, so rather than wasting you good people's time, i'll battle on.
>
> Thanks again.
>
>
> On Mon, May 10, 2010 at 3:37 AM, Diego Mijelshon
> <[email protected]>wrote:
>
>> I can't understand the last sentence, did you forget to type/paste
>> something?
>>
>> Anyway, this looks exactly like the case for table-per-class (i.e.
>> <joined-subclass>).
>> I suggest that you read
>> http://nhforge.org/doc/nh/en/index.html#inheritance, in particular
>> http://nhforge.org/doc/nh/en/index.html#inheritance-limitations.
>> Implicit polymorphism is the most limited strategy, and it usually makes
>> sense only if you are never going to query the whole hierarchy, only one
>> concrete class at once.
>>
>> Diego
>>
>>
>> On Sun, May 9, 2010 at 14:59, Jon Moore <[email protected]> wrote:
>>
>>> hi Diego,
>>> I don't think I can, we want the concrete classes (plug-in module
>>> projects) to be persisted in separate tables (witout a common primary
>>> key, and as far as i can tell from the documentation this is the only
>>> way to do it), so I guess the only way to do this is to store the entity
>>> type in a field in the concrete class table like a pseudo-discriminator -
>>> that way i can group by it...but seems a little dirty :(
>>>
>>>
>>> and as the concrete classes are defined in , a, to have a subclass or
>>> union subclass the mapping
>>>
>>> On Fri, May 7, 2010 at 1:21 PM, Diego Mijelshon
>>> <[email protected]>wrote:
>>>
>>>> I believe the .class pseudo-property is not available when using
>>>> implicit polymorphism.
>>>> Anyway, NHibernate is going to do multiple queries in that case, not
>>>> unions, so you might as well do it explicitly (one criteria query per
>>>> subclass).
>>>>
>>>> Have you considered switching to a different inheritance strategy?
>>>>
>>>> Diego
>>>>
>>>>
>>>> On Fri, May 7, 2010 at 08:27, Jon Moore <[email protected]> wrote:
>>>>
>>>>> Thanks guys, Diego was quite right - it was totally my issue with
>>>>> having incorrect data, I misunderstood the documentation and assumed it
>>>>> was
>>>>> a limitation but it was due to my duff data...my fault!
>>>>>
>>>>> Is there an identifier I can use to identify the type of concrete class
>>>>> in an Icritera query, i.e. so I can group by the type and
>>>>> count? something like this:
>>>>>
>>>>> var criteria = session.CreateCriteria(typeof (CoreItem));
>>>>> criteria.SetProjection(Projections.ProjectionList()
>>>>>
>>>>> .Add(Projections.Property("<<<TYPE>>>"), "Identifier")
>>>>> .Add(Projections.Count("Id"),
>>>>> "Result")
>>>>>
>>>>> .Add(Projections.GroupProperty("<<<TYPE>>")));
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> On Thu, May 6, 2010 at 9:01 PM, Diego Mijelshon <
>>>>> [email protected]> wrote:
>>>>>
>>>>>> I don't see why you can't use a different inheritance strategy.
>>>>>> NHibernate doesn't care in which assembly your classes are (of course,
>>>>>> you'll need to use full type names).
>>>>>>
>>>>>> Anyway, your query should work. Are you sure you have persistent
>>>>>> instances (rows) of both classes?
>>>>>>
>>>>>> Diego
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Thu, May 6, 2010 at 09:40, kmoo01 <[email protected]> wrote:
>>>>>>
>>>>>>> Hi guys,
>>>>>>> From the documentation I can see that implicit polymorphism, in my
>>>>>>> case, will not generate SQL UNIONs when performing polymorphic
>>>>>>> queries. but is there any way of looping through the concrete classes
>>>>>>> and union the results manually?
>>>>>>>
>>>>>>> My scenario:
>>>>>>>
>>>>>>> Im using a "Table per concrete class" approach, and I don't hold
>>>>>>> instances of the superclass
>>>>>>>
>>>>>>> Abstract class "CoreItem" (no mapping file needed)
>>>>>>> Concrete class "ResearchItem" inheriting from "CoreItem" with mapping
>>>>>>> file including all core item properties
>>>>>>> Concrete class "TestItem" inheriting from "CoreItem" with mapping
>>>>>>> file
>>>>>>> including all core item properties
>>>>>>>
>>>>>>> When I query the CoreItem like below I can see 2 queries run
>>>>>>> correctly
>>>>>>> from sqlprofiler, but only the second is returned...
>>>>>>>
>>>>>>> ICriteria crit = session.CreateCriteria(typeof(CoreItem));
>>>>>>> ..some expressions...
>>>>>>> crit.List<CoreItem>();
>>>>>>>
>>>>>>>
>>>>>>> Unfortunately I need to have the inheritance this way because the 2
>>>>>>> concrete items actually live in separate assemblies, meaning the
>>>>>>> abstract class doesn't have any knowledge of them (so cant do a
>>>>>>> subclass mapping - as far as im aware...)
>>>>>>>
>>>>>>> Cheers guys,
>>>>>>> kmoo01
>>>>>>>
>>>>>>> --
>>>>>>> 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]<nhusers%[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]<nhusers%[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]<nhusers%[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]<nhusers%[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]<nhusers%[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]<nhusers%[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]<nhusers%[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.