2009-06-15 18 views
9

¿Es posible hacer un mapeo en NHibernate sin usar una Id?Asignación de NHibernate sin Id.

Lo que estoy tratando de hacer es, llamar a un procedimiento almacenado utilizando

session.CreateSqlQuery(myQuery).AddEntity(typeof(MyEntity)); 

El procedimiento es un agregado y no hay ningún campo Id de ser devuelto, pero aun así me gustaría aprovechar NHibernate mapeo los datos devueltos a una entidad. Lo único que se me ocurrió hasta ahora es hacer que el procedimiento agregue un campo "O como Id" o algo así, y que la entidad tenga un campo de Id falso.

Respuesta

3

Me pareció que esto realmente no es posible. Los datos devueltos del procedimiento almacenado también deben tener Id. Funcionó para crear una columna ficticia con un Id y una propiedad ficticia en el objeto, pero decidí convertir a mano los datos devueltos por NHibernate a un objeto.

Básicamente, no debe usar procedimientos almacenados con NHibernate. Es un ORM después de todo. En mi caso, no tuve más remedio que usar el procedimiento.

0

Necesito verificar dos veces el xsd, pero creo que se requiere id o composite-id. Sin embargo, según los documentos, el nombre no es obligatorio. Por lo tanto, debería poder especificar una sección de identificación casi en blanco.

En una situación similar, configuré la clase mutable = "false" y correlacioné el id con el índice de fila y configuré el generador en la asignación de id a asignado.

+1

Bien, pregunta tonta. ¿Cómo se asigna un mapa al índice de fila? ¿Cómo se ve eso en el archivo de mapeo? Buscamos esto en la documentación y decidimos preguntar. – ferventcoder

4

Su entidad debe ser "única" de alguna manera, incluso si no tiene un campo Id.

decidir qué propiedades, tomados en conjunto, debe ser único, y el uso de una clave compuesta sobre ellos ...

<composite-id> 
    <key-property name="Property1" column="Column1"/> 
    <key-property name="Property2" column="Column2"/> 
</composite-id> 
0

Desde el puesto de @Andy McCluggage:

Puede mucho hacer esto en el mapeo:

<composite-id> 
    <key-property name="Property1" column="Column1"/> 
    <key-property name="Property2" column="Column2"/> 
</composite-id> 

embargo, debe reemplazar equals() y GetHashCode() en su modelo:

public class MyClass 
{ 
    public virtual DateTime Property1; 
    public virtual string Property2; 
    public virtual int SomeOtherProperty; 

    public override bool Equals(object obj) 
    { 
     if(obj == null) 
      return false; 

     var t = obj as MyClass; 

     if(t == null) 
      return false; 

     if (this.Property1 == t.Property1 && this.Property2 == t.Property2) 
      return true; 

     return false; 
    } 

    public override int GetHashCode() 
    { 
     return (this.Property1 + "|" + this.Property2).GetHashCode(); 
    } 
} 
Cuestiones relacionadas