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.