2011-10-27 18 views
7

Estoy intentando utilizar CompositeId para asignar a un sistema heredado. La base de datos de origen tiene una clave primaria compuesta, por lo que no puedo usar la asignación this.Id normal.Causas de CompositeId No se pudo compilar el error del documento de correlación

Aquí está mi intento de hacer un mapa:

public PriorityListPartMap() 
{ 
    this.Schema("EngSchedule"); 

    this.Table("vPriorityListPart"); 

    this.CompositeId().KeyProperty(x => x.AssemblyPartNumber).KeyProperty(x => x.PartNumber); 

    this.Map(x => x.CurrentDueDate); 

    this.Map(x => x.OrderLine); 

    this.Map(x => x.OrderNumber); 

    this.Map(x => x.PartDescription); 

    this.Map(x => x.ProductCode); 

    this.Map(x => x.Revision); 
} 

Cuando trato de crear la fábrica de sesión de esta asignación provoca el error: No se pudo compilar el documento de mapeo: (XmlDocument)

Probé la eliminación de la asignación CompositeId y lo reemplazó con:

this.Id(x => x.AssemblyPartNumber).GeneratedBy.Assigned(); 

el error desaparece con el que la cartografía, pero realmente no puedo usar ese pecado ce el AssemblyPartNumber no es único.

¿Hay una forma diferente de asignar a una tabla con una clave primaria compuesta?

Gracias,

Mateo MacFarland

Respuesta

25

¿Cuál es la excepción interna para "No se pudo compilar el documento de mapeo: (XmlDocument)"? Mi teoría es que será "class-id compuesta debe anular Equals(): YOURNAMESPACE.PriorityListPart".

Para entidades que requieren identificaciones compuestas, el objeto se utiliza como la clave. Para que los objetos que son "iguales" se reconozcan como tales, debe anular los métodos Equals y GetHashCode.

Un ejemplo Igual método para su entidad sería algo como esto:

public override bool Equals(object obj) 
{ 
    var other = obj as PriorityListPart; 

    if (ReferenceEquals(null, other)) return false; 
    if (ReferenceEquals(this, other)) return true; 

    return this.AssemblyPartNumber == other.AssemblyPartNumber && 
     this.PartNumber == other.PartNumber; 
} 

Un método GetHashCode ejemplo para su entidad sería algo como esto:

public override int GetHashCode() 
{ 
    unchecked 
    { 
     int hash = GetType().GetHashCode(); 
     hash = (hash * 31)^AssemblyPartNumber.GetHashCode(); 
     hash = (hash * 31)^PartNumber.GetHashCode(); 

     return hash; 
    } 
} 

Esto también significa que si desea recuperar un objeto, no puede tener una sola clave para hacerlo. Para recuperar correctamente un objeto específico con sus componentes de clave compuesta, la clave que utiliza es en realidad una instancia del objeto con los componentes clave compuestos establecidos para la entidad que desea recuperar.

Esta es la razón por la cual el método Equals() debe ser anulado, de modo que NHibernate tenga la capacidad de determinar qué objeto realmente está tratando de recuperar, de acuerdo con lo que especifique en el método Equals.

+0

Eso es ** brillante **! Funcionó perfectamente Mi error original no tenía una excepción interna, era nulo, pero tu solución era correcta de todos modos. Muchas gracias por su ayuda. –

+0

Solución perfecta - ¡funciona para mí! Mis entidades fueron creadas por http://nmg.codeplex.com/ sin igual. – Henrik

Cuestiones relacionadas