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

Responder a