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