la respuesta a la pregunta 1 es: debería usar la pos en la list solo la respuesta a la pregunta 2 es: el high es per persister per session-factory
El 14 de marzo de 2010 21:25, Mario Dal Lago <[email protected]>escribió: > gracias fabio, agregue el cascade, que me faltaba y cambie el Ilist por un > iEnumerable, y puse un Ilist privado. > > el mapping se corrigio, pero ahora tengo otro problemas. > > el schema que se genera es > > create table Galeria ( > GaleriaId INT not null, > primary key (GaleriaId) > ) > > create table Imagen ( > ImagenId INT not null, > [Path] NVARCHAR(255) null, > Description NVARCHAR(255) null, > galeria_key INT null, > idx INT not null, > primary key (ImagenId) > ) > > > > y cuando grablo la galeria con el mismo codigo anterior se ejecutan estas > instrucciones > > > NHibernate: select next_hi from hibernate_unique_key with (updlock, rowlock) > > NHibernate: update hibernate_unique_key set next_hi = @p0 where next_hi = > @p1;@p0 > = 2 [Type: Int32 (0)], @p1 = 1 [Type: Int32 (0)] > > NHibernate: select next_hi from hibernate_unique_key with (updlock, rowlock) > > NHibernate: update hibernate_unique_key set next_hi = @p0 where next_hi = > @p1;@p0 > = 3 [Type: Int32 (0)], @p1 = 2 [Type: Int32 (0)] > > NHibernate: INSERT INTO Galeria (GaleriaId) VALUES (@p0);@p0 = 32768 [Type: > Int32 (0)] > NHibernate: INSERT INTO Imagen ([Path], Description, ImagenId) VA > LUES (@p0, @p1, @p2);@p0 = 'image01.jpg' [Type: String (4000)], @p1 = 'Bota1' > [Type: String (4000)], @p2 = 65536 [Type: Int32 (0)] > > > y me da un > System.Data.SqlClient.SqlException: Cannot insert the value NULL into column > 'idx', table 'CONFORMTRY.dbo.Imagen'; column does not allow nulls. INSERT > fails. > The statement has been terminated. > > no se supone que el valor de idx lo tiene que tomar solo del list? o me > esta faltando setear algo a mano ? > > > y otra consulta, pq ejecuta 2 veces el select next_hi si estoy en la misma > session ? > > > gracias > > > * > Mario Dal Lago* > > > --- El *dom 14-mar-10, Fabio Maulo <[email protected]>* escribió: > > > De: Fabio Maulo <[email protected]> > Asunto: Re: [NHibernate-Hispano] Duda sobre mapping > Para: [email protected] > Fecha: domingo, 14 de marzo de 2010, 16:42 > > > Bueno varias cosas... > Primero tu domain: > - La propiedad Imagenes es de tipo IList<Imagen> con lo cual el > metodo AddImagen se puede no usar causando un pequeño desastre. Es probable > que no hayas escrito tus tests para el dominio. > Cuando se quiere proteger el Add lo que se publica es un IEnumerable<T> > > Segundo el mapping: > Como lo unico que estas guardando es Galeria y te parece raro el error que > tira NHibernate deduzco que lo que quieres que Galeria trabaje como > Aggregate (la tercera pregunta en de ConfORM es: ow manage cascade-actions > (read it as: which are aggregate-root) > Con: > orm.Cascade<Galeria, Imagen>(Cascade.All); > Tu mapping será > <class name="Galeria"> > <id name="Id" column="GaleriaId" type="Int32"> > <generator class="hilo" /> > </id> > <list name="Imagenes" cascade="all"> > <key column="galeria_key" /> > <list-index /> > <one-to-many class="Imagen" /> > </list> > </class> > <class name="Imagen"> > <id name="Id" column="ImagenId" type="Int32"> > <generator class="hilo" /> > </id> > <property name="Path" /> > <property name="Description" /> > </class> > > Notar que ese resultado es porque se trata de una OneToMany > unidirectional... hay otros puntos pero esos conciernen al uso de OneToMany > unidirectional en NH. > > > 2010/3/14 Mario Dal Lago > <[email protected]<http://ar.mc513.mail.yahoo.com/mc/[email protected]> > > > >> >> hola, >> >> tengo el siguiente dominio >> >> public >> class EntityBase >> { >> public virtual int Id { get; set; } >> } >> >> public class Imagen : EntityBase >> { >> public virtual string Path { get; private set; } >> public virtual string Description { get; private set; } >> internal Imagen() >> { >> } >> public Imagen(string description, string path) >> { >> this.Description = description; >> this.Path = path; >> } >> } >> >> >> public class Galeria : EntityBase >> { >> public virtual IList<Imagen> Imagenes { get; private set; } >> public Galeria() >> { >> Imagenes = >> new List<Imagen>(); >> } >> >> public void AddImagen(Imagen img) >> { >> Imagenes.Add(img); >> } >> } >> >> >> estoy usando ConfOrm para hacer el mapping de esta forma: >> >> var orm = new ObjectRelationalMapper(); >> orm.TablePerClass< >> Galeria>(); >> orm.TablePerClass< >> Imagen>(); >> orm.Patterns.PoidStrategies.Add( >> new HighLowPoidPattern()); >> mapper.AddPoidPattern(mi => mi.Name == >> "Id", (mi, idm) => >> idm.Column(mi.ReflectedType.Name<http://mi.reflectedtype.name/>+ >> "Id")); >> >> me genera el siguiente XML >> >> <?xml version="1.0" encoding="utf-8"?> >> <hibernate-mapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance >> " xmlns:xsd="http://www.w3.org/2001/XMLSchema >> " namespace="MDL.BahiaBsAs.Domain" assembly="MDL.BahiaBsAs.Domain" >> xmlns="urn:nhibernate-mapping-2.2"> >> <class name="Galeria"> >> <id name="Id" column="GaleriaId" type="Int32"> >> <generator class="hilo" /> >> </id> >> <list name="Imagenes"> >> <key column="galeria_key" /> >> <list-index /> >> <one-to-many class="Imagen" /> >> </list> >> </class> >> &nbs p;<class name="Imagen"> >> <id name="Id" column="ImagenId" type="Int32"> >> <generator class="hilo" /> >> </id> >> <property name="Path" /> >> <property name="Description" /> >> </class> >> </hibernate-mapping> >> >> >> al quierer insertar registros con este codigo me da una excepcion >> >> using >> (ISession s = factory.OpenSession()) >> { >> using (ITransaction tx = s.BeginTransaction()) >> { >> var galeria = new Galeria(); >> var imagen = new Imagen("Bota1","image01.jpg"); >> galeria.AddImagen(imagen); >> s.Save(galeria); >> tx.Commit(); >> } >> } >> ** >> me da una TransientObjectException >> con el siguiente mensaje : object references an unsaved transient instance >> - save the transient instance before flushing. Type: Domain.Imagen, Entity: >> Domain.Imagen >> ** >> ** >> hacer un s.Save(imagen), no soluciona el problema. >> >> es la primera vez que mapeo un List y no se si lo estoy unsando en forma >> correcta. >> >> gracias >> * * >> >> Mario Dal Lago >> >> ------------------------------ >> >> Encontra las mejores recetas con Yahoo! Cocina. >> http://ar.mujer.yahoo.com/cocina/ >> -- >> Para escribir al Grupo, hágalo a esta dirección: >> [email protected]<http://ar.mc513.mail.yahoo.com/mc/[email protected]> >> Para más, visite: http://groups.google.com/group/NHibernate-Hispano > > > > > -- > Fabio Maulo > > -- > Para escribir al Grupo, hágalo a esta dirección: > [email protected] > Para más, visite: http://groups.google.com/group/NHibernate-Hispano > > > ------------------------------ > > Encontra las mejores recetas con Yahoo! Cocina. > http://ar.mujer.yahoo.com/cocina/ > > -- > Para escribir al Grupo, hágalo a esta dirección: > [email protected] > Para más, visite: http://groups.google.com/group/NHibernate-Hispano > -- Fabio Maulo -- Para escribir al Grupo, hágalo a esta dirección: [email protected] Para más, visite: http://groups.google.com/group/NHibernate-Hispano
