Te respondo: 1- Sobre si se puede crear una tabla sin Id. la respuesta es no, este es uno de los grandes defectos de NHibernate, fijate no del Fluent, NHibernate tampoco lo hace, no se si otro ORM lo permitan pero no NHibernate. El requiere de Id en las tablas para poder indexarlas.
2- Sí es necesario ese codigo y no importa que algunos de los Id sean String, yo tambien tengo Id de tipo String y los puedo combinar perfectamente en una llave compuesta con otros campos de otros tipo, hasta con campos de tipo datetime, no hay problema. Funciona perfectamente Saludos El 14/06/11, Anthony Campos <[email protected]> escribió: > Dennis es necesario esta parte del codigo en la entidad no? > > 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); > } > > Te digo esto por que en algunas entidades tengo como Id un tipo de dato > varchar2 y que sepa el GetHashCode devuelve un int. > > Saludos > > > El 14 de junio de 2011 15:40, Anthony Campos <[email protected]> escribió: > >> Una consulta o duda que tengo, diganme es posible poder crear una entidad >> y >> mapearla pero sin tener que indicarle un PK? >> Lo que sucede es que tengo una entidad que que se llama PR_Fundo_Sala y en >> ella se van a grabar los Pk de otras entidades pero esta entidad no tiene >> un >> PK. >> >> Es posible eso? >> >> -Saludos- >> >> El 14 de junio de 2011 13:07, Dennis Alba <[email protected]> escribió: >> >> 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 >>> >> >> > > -- > 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
