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) VALUES (@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


      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