2009-07-27 24 views
9

En primer lugar, Tengo la siguiente tabla:Fluido NHibernate - Ahorro Entidad con clave compuesta

CREATE TABLE CustomerHub (
    CustomerId INT NOT NULL, 
    HubId INT NOT NULL 
) 

Qué he asignado a la entidad:

public class CustomerHub 
{ 
    public int CustomerId {get;set;} 
    public int HubId {get;set} 

    //GetHashCode, Equals, Etc... 
} 

El uso de este mapeo:

public class CustomerHubMap : ClassMap<CustomerHub> 
{ 
    UseCompositeId() 
     .WithKeyProperty(x => x.CustomerId) 
     .WithKeyProperty(x => x.HubId); 
} 

El problema que tengo es que cuando creo una nueva entidad de tipo CustomerHub e intento guardarla, no se conserva nada a la base de datos. Puedo recuperar todo bien, simplemente no guardarlos. Por ejemplo:

//this will work 
var x = session.CreateCriteria(typeof(CustomerHub)); 

//this will not 
using (var trans = session.BeginTransaction()) 
{ 
    var custHub = new CustomerHub {CustomerId = 293, HubId = 1193}; 
    var y = session.SaveOrUpdate(custHub); 
    trans.Commit(); 
} 

Lo curioso es que no se lanzan excepciones, simplemente no hace nada. Inicié NH Profiler (¡excelente herramienta!) Y parece que no está emitiendo ningún tipo de comando de inserción a la base de datos.

¿Pensamientos?

Nota: Me doy cuenta de que esta tabla se parece mucho a una tabla de unión (porque técnicamente lo es) y sería una relación ManyToMany en otra entidad como Cliente ... pero debido a un diseño de datos extremadamente confuso (es decir, sin tabla de Hub) es mucho más simple asignar la tabla de unión a una entidad y trabajar con ella de esa manera.

Respuesta

6

Editar (poner en la parte superior)

cita de documentos NHibernate:

Debido a su naturaleza inherente, las entidades que utilizan este generador no se pueden guardar a través del método() saveOrUpdate del ISession. En su lugar, debe especificar explícitamente NHibernate si el objeto se debe guardar o actualizar llamando al método Save() o Update() de la ISession.

http://www.nhforge.org/doc/nh/en/index.html#mapping-declaration-id-assigned (5.1.4.7)

ID compuestos tienen generador = asignado.

Esto se remonta a Identificación del compuesto = chupar :)


No está emitiendo un color o de comprometerse. Probablemente esté acostumbrado a trabajar con algo parecido a la identidad que emite un INSERT al guardar, pero los compuestos son asignados por su código, no por la base de datos, por lo que necesita un flush/commit para que se realice la inserción.


var custHub = new CustomerHub {CustomerId = 293, HubId = 1193}; 
var y = session.SaveOrUpdate(custHub); 
session.Flush(); 

o

using(var tx = session.BeginTransaction()) 
{ 
    var custHub = new CustomerHub {CustomerId = 293, HubId = 1193}; 
    var y = session.SaveOrUpdate(custHub); 
    tx.Commit(); 
} 

Además, una nota: el uso de claves compuestas hará que usted odia su vida. Muchas cosas no funcionan igual con las claves compuestas y no es inmediatamente obvio. Básicamente, NHibernate puede hacer menos trabajo, por lo que debe tomarse el relevo.

+0

Gracias por la respuesta rápida. En aras de la brevedad lo dejé, pero tengo todas mis llamadas en un código muy similar a su segundo ejemplo.También probé el color sin suerte. – jckeyes

+0

actualización agregada. No estaba seguro de lo de SaveOrUpdate, así que estaba esperando a ver si funcionaba o no: p – anonymous

+0

Hace poco estaba leyendo la sección sobre cómo funciona SaveOrUpdate y no estaba claro cómo manejaría la identificación compuesta ... que es Probablemente por qué simplemente ni siquiera lo intentan. – anonymous

Cuestiones relacionadas