Hola,

NHibernate no es un ROM sino un ORM.  Piensa en objetos y lo traduces a
tablas y relaciones. Chequea el ejemplo que te pongo abajo.

Saludos,
Nestor Andres Rodriguez

--------------Entidades -------------------

public partial class Entity1
    {
        public virtual int Id { get; set; }
        public virtual string Name { get; set; }
        public virtual IList<RelationShip> Entities2{ get; set; }
    }

    public partial class Entity2
    {
        public virtual int Id { get; set; }
        public virtual string Name { get; set; }
        public virtual IList<RelationShip> Entities1 { get; set; }
    }

    public partial class RelationShip
    {
        public virtual Entity1 Entity1{ get; set; }
        public virtual Entity2 Entity2{ get; set; }
        public virtual DateTime? Date{ get; set; }

        public override int GetHashCode()
        {
            return Entity2.GetHashCode() + Entity1.GetHashCode();
        }
        public override bool Equals(object obj)
        {
            if (ReferenceEquals(null, obj)) return false;
            if (ReferenceEquals(this, obj)) return true;
            var other = obj as RelationShip;
            if (other == null) return false;

            return (Entity1 == other.Entity1
                   && Entity2 == other.Entity2
                   && Date == other.Date);
        }
    }

------------------------------ Mapeo ----------------------
<class name="Entity1">
    <id name="Id">
      <generator class="assigned"></generator>
    </id>
    <property name="Name"/>
    <bag name="Entities2" table="Relationships" inverse="true">
      <key column="IdEntity1"/>
      <composite-element class="RelationShip">
        <parent name="Entity1"/>
        <many-to-one name="Entity2" class="Entity2" column="IdEntity2"/>
        <property name="Date"/>
      </composite-element>
    </bag>
  </class>
  <class name="Entity2">
    <id name="Id">
      <generator class="assigned"></generator>
    </id>
    <property name="Name"/>
    <bag name="Entities1" table="Relationships" cascade="all">
      <key column="IdEntity2"/>
      <composite-element class="RelationShip">
        <parent name="Entity2"/>
        <many-to-one name="Entity1" class="Entity1" column="IdEntity1"/>
        <property name="Date"/>
      </composite-element>
    </bag>
  </class>

------------------- Program................................................

class Program
    {
        static void Main(string[] args)
        {
            var conf = new Configuration().Configure();
            new SchemaExport(conf).Create(true, true);
            using (var sf = conf.BuildSessionFactory())
            {
                using (var s = sf.OpenSession())
                {
                    using (var tx = s.BeginTransaction())
                    {
                        var dennis = new Entity1 { Id = 1, Name = "dennis"
};
                        var carro = new Entity2 {Id = 1, Name = "carro"};

                        var relationship1 = new List<RelationShip> {
                            new RelationShip{ Entity1 = dennis, Entity2 =
carro, Date = DateTime.Now}};
                        var relationship2 = new List<RelationShip> {
                            new RelationShip{ Entity1 = dennis, Entity2 =
carro, Date = DateTime.Now}};

                        dennis.Entities2 = relationship1;
                        carro.Entities1 = relationship2;

                        s.Save(dennis);
                        s.Save(carro);
                        tx.Commit();
                    }
                }

                using (var s = sf.OpenSession())
                {
                    using (var tx = s.BeginTransaction())
                    {
                        var alba = new Entity1 { Id = 2, Name = "alba" };
                        var carro  = s.Get<Entity2>(1);

                        alba.Entities2 = new List<RelationShip> {};
                        carro.Entities1.First().Entity1 = alba;

                        s.Save(alba);
                        tx.Commit();
                    }
                }
            }
        }
    }



2011/9/2 Banzai <[email protected]>

> saludos tropa, una vez mas requiero la ayuda de Uds, en esta ocacion
> con Linq.
> resulta que tengo las siguientes clases:
>
>    public partial class Tabla1
>    {
>        public virtual int IdT1 { get; set; }
>        public virtual string NameT1 { get; set; }
>    }
>
>    public partial class Tabla2
>    {
>        public virtual int IdT2 { get; set; }
>        public virtual string NameT2 { get; set; }
>    }
>    public partial class RelacionT1_T2
>    {
>        public virtual Tabla1 tab1 { get; set; }
>        public virtual Tabla2 tab2 { get; set; }
>
>        public virtual DateTime? Fecha { get; set; }
>
>
>        public override int GetHashCode()
>        {
>            return tab2.GetHashCode() + tab1.GetHashCode();
>        }
>
>
>        public override bool Equals(object obj)
>        {
>            if (ReferenceEquals(null, obj)) return false;
>            if (ReferenceEquals(this, obj)) return true;
>            var other = obj as RelacionT1_T2;
>            if (other == null) return false;
>
>            return (tab1 == other.tab1
>                   && tab1 == other.tab1
>                   && Fecha == other.Fecha);
>        }
>    }
> esta ultima clase es para simular una relacion m-m entre tabla1 y
> tabla 2, por tanto los campos tab1 y tab2 ademas de ser referencias a
> sus respectivas tablas son la llave primaria de esta(personalmente uso
> Fluente NHibernate y estas tablas no son mas que ejemplos que pongo,
> el contexto real es mas complicado y fluent no me presta las
> herramientas para poder hacer una relacion m-m complejas por tanto
> creo esta clase para simular dicha relacion)
>
> supongamos entonces que tengo en la tabla1 las siguientes ocurrencias
> IDT1     NAMET1
> 1         dennis
> 2         alba
>
> en la tabla 2 tenemos
> IDT2     NAMET2
> 1          carro
>
> y en relacion t1_t2
> IDT1     IDT2     FECHA
> 1          1          02/09/2011 03:57:19 p.m.
> requiero entonces que en un momento determinado mandar a cambiar en la
> tabla que se crea para la clase RelacionT1_T2  el valor del IDT1 que
> en este momento es 1 y pertenece a dennis como se ve arriba y ponerle
> el valor 2 que pertenece a alba
>
> esto lo intente hacerlo con Updtae y Merge pero no funciona con
> ninguno por supuesto porque a ambos se le ha de pasar el objeto que se
> desea modificar, con este objeto el busca la llave primaria en la BD y
> cuando lo encuentra lo modifica, pero como lo que voy a modificar es
> la llave primaria el no encontrara jamas el 2-1 que le paso por el
> objeto ya que solo existe 1-1 por tanto no me actualiza.
> La pregunta es hay alguna forma de programar en linq esta
> actualizacion como se hacia normalmente con SQL ya saben "update tabla
> en campos los values where condicion" u otra forma???
> muchas gracias
>
> --
> Para escribir al Grupo, hágalo a esta dirección:
> [email protected]
> Para más, visite: http://groups.google.com/group/NHibernate-Hispano

-- 
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