ok, gracias por las aclaraciones....

como bien decis podria usar un bag, pero tendria q manejar el orden a mano, por 
eso preferia usar un list.

en NH 2.X..tambien esta el bug , o es solo de NH 3.x...

cual es tu recomendación ?


Mario Dal Lago

--- El lun 15-mar-10, Fabio Maulo <[email protected]> escribió:

De: Fabio Maulo <[email protected]>
Asunto: Re: [NHibernate-Hispano] Duda sobre mapping
Para: [email protected]
Fecha: lunes, 15 de marzo de 2010, 13:22

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 explicitamenteorm.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 solola 
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]>











 
 hola, 
 
tengo el siguiente dominio
 

publicclass 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 + "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]




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





-- 

Para escribir al Grupo, hágalo a esta dirección: 
[email protected]

Para más, visite: http://groups.google.com/group/NHibernate-Hispano


      Yahoo! Cocina

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

Responder a