LINQ es un lenguaje de consulta no para hacer updates o deletes.
Miraste el ejemplo que te di en el otro post ? No es necesario hacer un
"Linq" para eso o un update en batch o algo asi. Es necesario tener bien
mapeado el dominio. El problema con lo que tienes tu es que estas tratando
de mapear una relacion m-to-m pero tal cosa no existe en objetos...
--------------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/5 Dennis Alba <[email protected]>
> el ejemplo lo tengo puesto en el post que subi anteriormente "Update
> con linq de NHibernate "
> imagina que tengo 3 clases
> CA
> int IdA
> string NombA
>
> CB
> int IdB
> string NombB
>
> C-AB
> CA instA
> CB instB
> datetime Fecha
>
> estas son las tres clases, como puedes ver C-AB es una clase que tiene
> dos entidades una de CA y otra de CB y no tiene un campo que sea la
> llave primaria pues en el mapeo, estas instancias seran FK pero su
> combinacion sera PK, osea esta clase creara una tabla que simula una
> relacion m-m entre esas dos clases. Pues bien el update que necesito
> ahcer es el siguiente
> supon que tengo insertadas ya en las tablas los siguientes datos
> CA IdA NombA
> 1 ariel
> 2 maria
> CB idB NombB
> 1 varon
> 2 hembra
>
> C_AB instA instB Fecha
> 1 1 05/09/2011
> como puedes ver la informacion en C-AB es que ariel(1 en instA) es
> varon(1 en instB)
> pero yo quiero actualizar esta tabla y que quede de la siguiente forma:
>
> C_AB instA instB Fecha
> 1 2 05/09/2011
> ahora estaria diciendo que ariel(1 en instA) es hembra(2 en instB)
> en linq 2 NHiberntae no puedo hacer esto pues el metodo Update que
> tiene para que funcione se basa en las llaves primarias, pero es que
> presisamente unas de las cosas que quiero modifica es las llaves
> primarias, es por ello que necesito programar yo la query. Espero
> entiendas el entorno del fenomeno
> Gracias
>
>
>
> El 05/09/11, Carlos Peix <[email protected]> escribió:
> > Que tipo de update querrias hacer?
> >
> > Nunca me he tenido esta necesidad, con un ORM. Podrias dar un ejemplo?
> >
> > ----------------------------------
> > Carlos Peix
> >
> > 2011/9/5 Banzai <[email protected]>
> >
> >> Saludos tropa:
> >> Dado que no he podido encontrar la forma en que por "linq 2
> >> NHibernate" crear un UPDATE no me qeda mas remedio que hacer esta
> >> consulta por HQL para seguir garantizando que estas operaciones sean
> >> independientes del SGBD. Por tal motivo la pregunta es la siguiente.
> >> Sabe alguien como se declara una consulta HQL (Tipo UPDATE) y a quien
> >> se debe llamar para que implemente y obtenga el resultado de dicha
> >> consulta??
> >> Muchas gracias a todos
> >>
> >> --
> >> 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
>
> --
> 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