Hola Andrés, las tablas son bastante simples. Antes de pegar el código
comento un par de cosas:

* Como dato a resaltar, los médicos son Personal, y en la tabla Medico
unicamente se guarda la matricula.
* Si en lugar de dos tablas, Personal y Medico fueran una sola (o una Vista
que representa a una sola tabla), y yo no tengo que hacer el mapping
mediante el Join, NH infiere la propiedad TipoDocumento del médico y la
resuelve sin problemas.
* No hay una clase PERSONAL (si una tabla) porque entiendo que para
resolver esto no se necesita.


*//TABLAS (simplificadas)*
TipoDocumento
    [Id] [bigint] IDENTITY(1,1) NOT NULL
    [Codigo] [varchar](20) NOT NULL
    [Descripcion] [varchar](50) NOT NULL

Personal
    [Id] [bigint] IDENTITY(1,1) NOT NULL,
    [Nombres] [varchar](50) NOT NULL,
    [Apellidos] [varchar](150) NOT NULL,
    [Sexo] [char](1) NOT NULL,
    [TipoDocumentoId] [bigint] NULL,
    [NumeroDocumento] [int] NOT NULL,

Medico
    [Id] [bigint] IDENTITY(1,1) NOT NULL,
    [PersonalId] [bigint] NOT NULL,
    [Matricula] [varchar](30) NULL,



*//Mappings (simplificados)*
    public class TipoDocumentoMapping : ClassMapping<TipoDocumento>
    {
        public TipoDocumentoMapping()
        {
            Id(x => x.Id, m => m.Generator(Generators.Identity));
            Property(o => o.Codigo, m =>
m.Type((IIdentifierType)TypeFactory.GetAnsiStringType(20)));
            Property(o => o.Descripcion, m =>
m.Type((IIdentifierType)TypeFactory.GetAnsiStringType(50)));
        }
    }

    public class MedicoMapping : ClassMapping<Medico>
    {
        public MedicoMapping()
        {
            *//Esto es lo que está mal, no se como generar el Join si
Médico posee la propiedad TipoDocumento que no sea de un tipo primitivo*
            Id(x => x.Id, m => m.Generator(Generators.Identity));
            Join("Personal", j =>
            {
                j.Key(k => k.Column("Id"));
                j.Property(o => o.Nombres, m =>
m.Type((IIdentifierType)TypeFactory.GetAnsiStringType(50)));
                j.Property(o => o.Apellidos, m =>
m.Type((IIdentifierType)TypeFactory.GetAnsiStringType(150)));
                j.Property(o => o.Sexo, m => { m.Column(a =>
a.SqlType("char")); });
                j.Property(o => o.NumeroDocumento, m => {
m.Column("NumeroDocumento"); });
            });

        }
    }



*//Clases (Simplificadas):*    public class Medico : Entity
    {
        public virtual long Id { get; set; }

        *//public virtual TipoDocumento TipoDocumento { get; protected set;
} Si esta propiedad no está comentada, no sabe resolver el Join*

        public virtual int NumeroDocumento { get; protected set; }

        public virtual char Sexo { get; protected set; }

        public virtual string Apellidos { get; protected set; }

        public virtual string Nombres { get; protected set; }

        public override string ToString()
        {
            return string.Format("{0} {1}", Apellidos.Trim(),
Nombres.Trim()).Trim();
        }
    }

    public class TipoDocumento : Entity
    {
        public virtual long Id { get; set; }

        public virtual string Codigo { get; protected set; }

        public virtual string Descripcion { get; protected set; }
    }



Saludos Y ÉXITOS!!




--
Juan José Montes de Oca Arbós.

===========================
Web personal: http://juanjose.montesdeocaarbos.com.ar/blog/

El 26 de febrero de 2018, 2:08, Andrés Falcón <[email protected]> escribió:

> Hola Juan
>
> Te pido si podes poner el mapping de todas las clases que tenga relación
> con lo que querés hacer y de la estructura de las tablas correspondientes.
> Así podemos tener un panorama completo.
>
> Saludos.
>
> El lunes, 8 de enero de 2018, 16:43:10 (UTC-3), Juan José Montes de Oca
> Arbós escribió:
>>
>> Buenas grupo!!!
>>
>> En un proyecto en el que estoy trabajando, necesito mapear 2 tablas para
>> generar una sola entidad. No tengo mayores inconvenientes con eso (utilizo
>> JOIN), pero una de esas tablas tiene una relación contra otra tabla (como
>> una propiedad) y esa es la parte que no me doy cuenta como resolver.
>>
>> Si no mapeo la entidad que es una propiedad (para que la infiera NH), el
>> sistema me indica el siguiente error:
>>
>> *Missing column: TipoDocumentoId in Hospital.dbo.Medico*
>>
>> Si mapeo dicha entidad, el sistema me indica el siguiente error:
>>
>> *Could not determine type for: Domain.TipoDocumento, Domain,
>> Version=1.0.0.0, Culture=neutral, PublicKeyToken=null, for columns:
>> NHibernate.Mapping.Column(TipoDocumentoId)*
>>
>>
>> A nivel de base de datos, tengo una tabla que representa el Personal de
>> un hospital, con sus datos básicos (Nombre, Nro de documento, Tipo de
>> Documento, etc) y otra tabla que representa a los Médicos de dicho Hospital
>> con sus datos destacados (Matricula, y PersonalId).
>>
>> La entidad en C# que quiero representar es un médico, que tiene Nombre,
>> Nro Documento, Tipo de Documento y Matricula. El problema es que Tipo de
>> Documento es otra tabla, y no se como representarla en los mappings.
>>
>> Tengo estas tablas:
>>
>>
>> y este diagrama de clases
>>
>>
>> El mapeo que tengo es este:
>>
>>             Join("Personal", j =>
>>             {
>>                 j.Key(k => k.Column("Id"));
>>                 j.Property(o => o.Nombres, m =>
>> m.Type((IIdentifierType)TypeFactory.GetAnsiStringType(50)));
>>                 j.Property(o => o.Apellidos, m =>
>> m.Type((IIdentifierType)TypeFactory.GetAnsiStringType(150)));
>>                 j.Property(o => o.Sexo, m => { m.Column(a =>
>> a.SqlType("char")); });
>>                 j.Property(o => o.NumeroDocumento, m => {
>> m.Column("NumeroDocumento"); });
>>
>>
>>
>> *j.Property(o => o.TipoDocumento, m =>
>> {                    m.Column(a => { a.Name("TipoDocumentoId");
>> a.SqlType("bigint"); });                });*
>>             });
>>
>> Estoy medio perdido, pero no me doy cuenta como resolverlo, googleando y
>> leyendo documentación no encontré ningún ejemplo con un caso como este.
>>
>> Si elimino la propiedad TipoDocumento de la clase Medico, funciona bien
>> (obviamente sin tener esa propiedad disponible, que la necesito).
>>
>> ¿Alguna punta por donde puedo encontrar la solución?
>>
>>
>> GRACIAS!!!
>>
>>
>> --
>> Juan José Montes de Oca Arbós.
>>
>> --
> --
> Para escribir al Grupo, hágalo a esta dirección: NHibernate-Hispano@
> googlegroups.com
> Para más, visite: http://groups.google.com/group/NHibernate-Hispano
> ---
> Has recibido este mensaje porque estás suscrito al grupo
> "NHibernate-Hispano" de Grupos de Google.
> Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes,
> envía un correo electrónico a nhibernate-hispano+
> [email protected].
> Para acceder a más opciones, visita https://groups.google.com/d/optout.
>

-- 
-- 
Para escribir al Grupo, hágalo a esta dirección: 
[email protected]
Para más, visite: http://groups.google.com/group/NHibernate-Hispano
--- 
Has recibido este mensaje porque estás suscrito al grupo "NHibernate-Hispano" 
de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, 
envía un correo electrónico a [email protected].
Para obtener más opciones, visita https://groups.google.com/d/optout.

Responder a