Bueno te comento,

Utilizando NH 3.0 hice el mapeo que tu sugeriste y luego de algunos ajustes

ya funciona igual que el query.  Los ajustes que hice fueron:

1- Cambie los campos a propiedades para hacerlo mas rapido, no significa que


toque hacerlo con propieades solo que tendrias que colocar access="field".

2- En el mapeo de <union-subclass> si fue necesario colocar Abstract =

"True" de lo contrario verificando con el SchemaExport SI generaria una

tabla para Party.

3- En el mapeo de Customer->Party el <many-to-one> tiene el property
="Party" pero deberia ser property="Actor".

4- En tu clase de Customer existe una propiedad de tipo Party llamada Actor.

 Asi que tienes que cambiar el query para que el join sea c.Actor en lugar
de c.Party.

Cuentame si te funciona.

Nestor Andres Rodriguez

<class name="Party" abstract="true">
    <id name="Id">
      <generator class="guid.comb"/>
    </id>
    <union-subclass name="Person" table="People">
      <property name="FirstName"/>
      <property name="LastName"/>
    </union-subclass>
    <union-subclass name="Company" table="Companies">
      <property name="CompanyName"/>
    </union-subclass>
  </class>

  <class name="Customer" table="Customers">
    <id name="Id">
      <generator class="guid.comb"/>
    </id>
    <many-to-one name="Actor" cascade="save-update"
          unique="true" column="PartyId"/>
  </class>

  <class name="Order" table="Orders">
    <id name="Id">
      <generator class="guid.comb"/>
    </id>
    <many-to-one name="Customer" class="Customer" column="CustomerId"/>
  </class>


public class Order
    {
        public virtual Guid Id
        {
            get;
            set;
        }

        public virtual Customer Customer
        {
            get;
            set;
        }
    }

    public class Party
    {
        public virtual Guid Id
        {
            get;
            set;
        }
    }

    public class Customer
    {
        public virtual Guid Id
        {
            get;
            set;
        }

        public virtual Party Actor
        {
            get;
            set;
        }
    }

    public class Company : Party
    {
        public virtual string CompanyName
        {
            get;
            set;
        }
    }


    public class Person : Party
    {
        public virtual string FirstName
        {
            get;
            set;
        }
        public virtual string LastName
        {
            get;
            set;
        }
    }


////// Program.cs

static void Main(string[] args)
        {
            var configuration = new Configuration().Configure();
            new SchemaExport(configuration).Create(true, true);
            var sessionFactory = configuration.BuildSessionFactory();

            using (var session = sessionFactory.OpenSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    var result = session.CreateQuery("select o from Order o
join fetch o.Customer c join fetch c.Actor p").List<Domain.Order>();
                    Console.WriteLine(result.Count);
                }
            }

            Console.ReadLine();
        }
2011/6/3 [email protected] <[email protected]>

> Para el mapping y las tablas:
>  http://nhforge.org/doc/nh/en/index.html#inheritance-strategies
>
> y dale una mirada a la tabla de 8.1 (
> http://nhforge.org/doc/nh/en/index.html#inheritance-limitations) que te
> puede ayudar a decidir que estrategia de mapeo usar.
>
> saludos.
> nelo
>
>
> 2011/6/3 Carlos Peix <[email protected]>
>
>> Hola Nestor,
>>
>>  2011/6/3 Nestor Rodriguez <[email protected]>
>>
>>> 1.  Si incluyes abstract=true en un mapeo <union-sub-class> no te va a
>>> generar tabla para la clase abstracta.
>>
>>
>> Supongo que quisiste escribir <union-subclass>, en ese caso, me queda el
>> mapeo que copio a continuacion. No se requiere colocar abstract="true" y,
>> efectivamente, no requiere una tabla para Party. Esto ya lo habia comentado
>> en un post anterior.
>>
>>  <class name="Party">
>> <id name="Id">
>> <generator class="guid.comb"/>
>> </id>
>> <union-subclass name="Person" table="People">
>>  <property name="FirstName"/>
>> <property name="LastName"/>
>> </union-subclass>
>> <union-subclass name="Company" table="Companies">
>> <property name="CompanyName"/>
>> </union-subclass>
>> </class>
>>
>>  2.  El incluir el abstract=true en un mapeo de <subclass> DEBES colocar
>>> la tabla en la definicion de la clase <class name=Party table=Parties> ya
>>> que esta estrategia persiste todo en una sola tabla.
>>>
>>
>> Entiendo que aca estaas hablando de este otro enfoque para la
>> persistencia:
>>
>>  <class name="Party" abstract="true">
>>  <id name="Id">
>> <generator class="guid.comb"/>
>> </id>
>> </class>
>>
>> <subclass name="Person" extends="Party" table="People">
>>  <property name="FirstName"/>
>> <property name="LastName"/>
>> </subclass>
>>
>> <subclass name="Company" extends="Party" table="Companies">
>> <property name="CompanyName"/>
>> </subclass>
>>
>> En este caso no persiste todo en una sola tabla sino que es una tabla por
>> cada clase (incluso la abstracta).
>>
>>  3. Me surge la duda de si NHibernate te coloca automaticamente un
>>> <discriminator-column> y los <discriminator-values> cuando mapeas el <class>
>>> y las <subclass> respectivamente.  Pensaria que deberias incluirlos.
>>>
>>
>> Entiendo que el discriminator solo es necesario en caso de que tengas una
>> tabla para la clase abstracta o una tabla para toda la jerarquia.
>>
>>
>>> 4. Despues de esto verifica de nuevo el query.
>>>
>>
>> Ya he hecho la verificacion con estos dos mappings y no funciona en
>> ninguno de los dos casos, siempre con el mismo error.
>>
>>
>>>
>>> Saludos
>>>
>>
>> Muchas gracias
>>
>> ----------------------------------
>> Carlos Peix
>>
>> --
>> Para escribir al Grupo, hágalo a esta dirección:
>> [email protected]
>> Para más, visite: http://groups.google.com/group/NHibernate-Hispano
>>
>
> --
> Para escribir al Grupo, hágalo a esta dirección:
> [email protected]
> Para más, visite: http://groups.google.com/group/NHibernate-Hispano
>

-- 
Para escribir al Grupo, hágalo a esta dirección: 
[email protected]
Para más, visite: http://groups.google.com/group/NHibernate-Hispano

Responder a