podrias hacerlo de forma tal que la clase cultivo tenga instancias de
las otras clases que mecionas
public partial class Pais
{
public virtual long IdPais { get; set; }
public virtual string nombrePais { get; set; }
...
}
public partial class Ciudad
{
public virtual long IdCiudad { get; set; }
public virtual string nombreCiudad { get; set; }
...
}
public partial class Fundo
{
public virtual long IdFundo { get; set; }
public virtual string nombreFundo { get; set; }
...
}
public partial class Cultivo
{
public virtual long IdCultivo { get; set; }
public virtual string nombreCultivo { get; set; }
//campos de la otra clase necesarios para la llave compuesta y foranea
public virtual Fundo instFundo{ get; set; }
public virtual Ciudad instCiudad{ get; set; }
public virtual Pais instPais{ get; set; }
public override int GetHashCode()
{
return this.IdCultivo .GetHashCode() + this.instFundo.GetHashCode()
+ this.instCiudad.GetHashCode() + this.instPais.GetHashCode();
}
public override bool Equals(object obj)
{
return base.Equals(obj);
}
}
y el mapeo de esta ultima clase seria
public class MapeoCultivo: ClassMap<Cultivo>
{
public MapeoCultivo()
{
// nombre de la tabla
Table("P_CULTIVO");
// Llave primaria compuesta
CompositeId().KeyProperty(x => x.IdCultivo , "CULTIVO_ID")
.KeyReferences(x => x.instFundo, "FUNDO_ID")
.KeyReferences(x => x.instCiudad, "CIUDAD_ID")
.KeyReferences(x => x.instPais, "PAIS_ID");
// Campos de la tabla
Map(x =>
x.nombreCultivo ).Column("NOMBCULTIVO").Not.Nullable().Length(15);
}
}
El ejemplo que te acabo de poner es en el caso de que la clase cultivo
tenga instancias de las otras clases, aqui podras ver en el mapeo como
en los campos que hacen referencia a otras clases en vez de poner
KeyProperty esta KeyReferences, esa es la forma
El 14/06/11, Anthony Campos <[email protected]> escribió:
> MUCHAS GRACIAS DENNIS TE PASASTE Y SI MIRA JUSTO ESTABA VIENDO LAS DEMAS
> TABLAS Y VOY A TENER QUE AGREGAR CLAVES DE OTRAS ENTIDADES Y PONERLAS COMO
> PRIMARIAS EN OTRA ENTIDAD POR EJEMPLO TE PONGO UN CASO:
>
> TENGO LA ENTIDAD CULTIVO EN DONDE ADEMAS DE TENER EL CAMPO CULTIVO_ID SE
> CONSIDERA TAMBIEN LAS CLAVES DE OTRAS ENTIDADES ( PAIS_ID, CIUDAD_ID,
> FUNDO_ID) ES DECIR LA CLAVE PRINCIPAL DE LA ENTIDAD CULTIVO SERIA:
>
> --> PAIS_ID, CIUDAD_ID, FUNDO_ID, CULTIVO_ID
>
> LAS LLAVES QUE VIENEN DE LAS OTRAS ENTIDADES SON ESTAS:
>
> PAIS ( PAIS_ID)
> CIUDAD ( PAIS_ID, CIUDAD_ID)
> FUNDO ( PAIS_ID, CIUDAD_ID, FUNDO_ID)
>
> OJALA ME ENTIENDAS LA IDEA Y ME ORIENTES.
>
> El 14 de junio de 2011 10:09, Dennis Alba <[email protected]> escribió:
>
>> realmente no, lo he usado en varios proyectos y funciona bien, incluso
>> cuando partes de la llave son a su vez llaves foraneas de otras
>> clases, que entonces el codigo del mapeo cambia un poco, te lo puedo
>> mostrar cuando lo necesites, porque es muy probable que en algun
>> momento lo requieras. El unico inconveniente de esta forma de mapeo de
>> llaves compuestas es que no he logrado ponerle el tamaño del campo que
>> yo deseo, Osea si se lo pongo peo en la BD no lo coge, pone el tamaño
>> que desee la BD. Pero por lo demas funciona bien.
>> Me explico referente al tamaño:
>>
>> si te fijas en el codigo que te di, en el mapeo de los campos se
>> especifica el tamaño que tendran en la BD los campos NOMBREANALISIS y
>> ESTADO(este ultimo veo que te lo repeti, esta demas porque ya esta en
>> la llave compuesta)
>>
>> Map(x =>
>> x.nombreAnalisis).Column("NOMBREANALISIS").Not.Nullable().Length(15);
>>
>> como ves, a NOMBREANALISIS le dije que tendra un tamaño de 15
>> caracterres en la BD, esto asi funciona perfectamente, pero cuando lo
>> ponemos como parte de una llave compuesta le puedes especificar todo
>> lo que quieras que al final en la BD no lo coge, Para especificar el
>> tamaño en la llave compuesta se hace como te pongo abajo:
>>
>> // Llave primaria
>> CompositeId().KeyProperty(x => x.IdAnalisis, c =>
>> c.ColumnName("ID_ANALISIS").Length(8))
>> .KeyProperty(x => x.Estado, c =>
>> c.ColumnName("ESTADO").Length(10)).KeyProperty(x => x.Pasaporte, c =>
>> c.ColumnName("PASAPORTE").Length(10))
>> .KeyProperty(x => x.Sololicitud, c =>
>> c.ColumnName("SOLICITUD").Length(15));
>>
>> que no te lo habia puesto porque ya te digo no me funciona, pero igual
>> ahi lo tienes para que lo domines para que cuando funcione sepas como
>> usarlo.
>>
>> El 14/06/11, Anthony Campos <[email protected]> escribió:
>> > Muchas gracias DENNIS, es justo lo que estaba buscando, pero dime es
>> > recomendable hacer eso es decir no habria alguna dificultad en el
>> transcurso
>> > del desarrollo?
>> >
>> > Saludos-
>> >
>> > El 14 de junio de 2011 09:46, Dennis Alba <[email protected]> escribió:
>> >
>> >> si existe y es de la siguiente forma, supon que tienes una clase
>> >> Analisis con la siguiente estructura
>> >>
>> >> public partial class Analisis
>> >> {
>> >> public virtual long IdAnalisis { get; set; }
>> >> public virtual string nombreAnalisis { get; set; }
>> >>
>> >> //campos de la otra clase necesarios para la llave compuesta y
>> >> foranea
>> >> public virtual string Sololicitud { get; set; }
>> >> public virtual long Pasaje { get; set; }
>> >> public virtual string Estado { get; set; }
>> >>
>> >> //public virtual Proyecto proInst { get; set; }
>> >>
>> >>
>> >> public override int GetHashCode()
>> >> {
>> >> return this.IdAnalisis.GetHashCode() +
>> >> this.Sololicitud.GetHashCode()
>> >> + this.Pasaje.GetHashCode() +
>> this.Estado.GetHashCode();
>> >> }
>> >>
>> >> public override bool Equals(object obj)
>> >> {
>> >> return base.Equals(obj);
>> >> }
>> >> }
>> >>
>> >> OJO los metodos GetHashCode y Equals los debes redefinir como vez, de
>> >> lo contrario no funcionara.
>> >>
>> >> luego hacemos el respectivo mapeo
>> >>
>> >> public class MapeoAnalisis: ClassMap<Analisis>
>> >> {
>> >> public MapeoAnalisis()
>> >> {
>> >> // nombre de la tabla
>> >> Table("P_ANALISIS");
>> >>
>> >> // Llave primaria compuesta
>> >> CompositeId().KeyProperty(x => x.IdAnalisis, "ID_ANALISIS")
>> >> .KeyProperty(x => x.Estado, "ESTADO").KeyProperty(x =>
>> >> x.Pasaje, "PASAJE")
>> >> .KeyProperty(x => x.Sololicitud, "SOLICITUD");
>> >>
>> >>
>> >> // Campos de la tabla
>> >> Map(x =>
>> >> x.nombreAnalisis).Column("NOMBREANALISIS").Not.Nullable().Length(15);
>> >> Map(x =>
>> x.Estado).Column("ESTADO").Not.Nullable().Length(15);
>> >>
>> >> }
>> >> }
>> >>
>> >> esto es siempre que las llaves primarias este compuesto por campos
>> >> propios de esta clase Analisis
>> >>
>> >> El 14/06/11, Anthony Campos <[email protected]> escribió:
>> >> > Estimados una consulta, estoy utilizando el fluent nhibernate y
>> >> quisiera
>> >> > saber si es posible poder mapear como ID varias columnas?
>> >> >
>> >> > Si se pudiera hacer eso diganme es recomendable hacer eso? Habria
>> alguna
>> >> > implicancia en hacer ese tipo de mapeo?
>> >> >
>> >> > Gracias.
>> >> >
>> >> > --
>> >> > 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
>>
>> --
>> 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