hace tiempo habia visto ese problema, con una one-to-many, y me dije: "cuando voy a refactorizar los binders lo arreglo" Obviamente me olvidé ya que no ingresé el issue en el JIRA. Bueno... el asunto de haberlo visto ante hizo que lo arreglé al toque.
Voy a agregar el issue y a commitear el fix. Gracias Mario. El 15 de marzo de 2010 12:22, Fabio Maulo <[email protected]> escribió: > Bug confirmado > > El 15 de marzo de 2010 08:50, Fabio Maulo <[email protected]> escribió: > > Por ahora... >> ya que parece que es la primera vez que usas list, podes usar bag >> declarando explicitamente >> orm.Bag<Baleria>(x=> x.Imagenes); >> o usando ICollection como type the Imagenes (en el field por ejemplo) >> >> El 15 de marzo de 2010 08:47, Fabio Maulo <[email protected]>escribió: >> >> Mario, >>> parece que hay un bug en NHibernate. >>> list-index debería ser el tag actualizado de lo que ante era <index>. >>> <index> se usaba para todas las collection indexada (array, map, list, >>> primitive-array) luego se hicieron tag especificos pero se mantuvo el viejo >>> tag. >>> Veré de preparar un test y de hacer el fix en el trunk de NH. >>> Despues veo si cambio tambien el tag en ConfORM para que si se utilizan >>> los XML para trabajar con NH2.1.x pueda funcionar. >>> Gracias por el dato. >>> >>> El 15 de marzo de 2010 00:46, Fabio Maulo <[email protected]>escribió: >>> >>> 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 >>>> >>>> >>> >>> >>> -- >>> Fabio Maulo >>> >>> >> >> >> -- >> Fabio Maulo >> >> > > > -- > Fabio Maulo > > -- 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
