2012-02-02 16 views
7

Estoy creando un mapeo subclase Fluido N de hibernación que en la actualidad se ve algo como esto:¿Puede especificar la columna de identidad cuando usa la estrategia Fluent Nhibernate Table-Per-Subclass?

public class TaskDownloadMap: SubclassMap<TaskDownload> 
{ 
    public TaskDownloadMap() 
    { 
     Table("TasksDownload"); 

     Map(x => x.ExtraProperty1, "ExtraProperty1") 
      .Nullable(); 

     Map(x => x.ExtraProperty2, "ExtraProperty2") 
      .Nullable(); 
    } 
} 

Cuando intento y guardar una de estas entidades Puedo obtener una excepción:

Test.TaskRepositoryTest.DeleteTest: 
NHibernate.Exceptions.GenericADOException : could not insert: [TaskManager.Entities.TaskDownload#269][SQL: INSERT INTO TasksDownload (ExtraProperty1, ExtraProperty2, Task_id) VALUES (?, ?, ?)] 
    ----> System.Data.SqlClient.SqlException : Invalid column name 'Task_id'. 

Es porque el Id La columna que he configurado en la tabla de mi subclase se llama "TaskId". ¿Hay algo para anular el esquema de nombres predeterminado que nhibernate está tratando de usar? No parece tener la capacidad de especificar la columna "Id" en la subclase y no puedo encontrar a nadie más, incluso hablando de ello.

El padre de mapeo se ve así:

public class TaskMap: ClassMap<Task> 
{ 
    public TaskMap() 
    { 
     Table("Tasks"); 

     Id(x => x.Id, "Id") 
      .GeneratedBy.Identity(); 

     . 
     . 
     . 

    } 
} 

Como dije antes voy con la estrategia de tabla-por-Subclase lo que estos son 2 tablas diferentes. Puedo cambiar la clave en mi tabla TasksDownload para que sea "Task_id", pero prefiero poder especificar que es "TaskId" en mi asignación para que pueda cumplir con mi convención de nomenclatura.

+0

¿Cómo es su jerarquía parece? ¿Puedes publicar el mapeo de padres? – nemesv

+0

Publicación editada para tener una asignación principal. –

Respuesta

4

No puede configurar los ID de la Subclase con la API fluida porque se maneja mediante las convecciones de asignación incorporadas. Pero puede escribir un convention personalizado (con algunos acceptance adicionales si es necesario).
Una solución de la muestra:

public class JoinedSubclassIdConvention : IJoinedSubclassConvention, 
    IJoinedSubclassConventionAcceptance 
{ 
    public void Apply(IJoinedSubclassInstance instance) 
    { 
     instance.Key.Column(instance.EntityType.BaseType.Name + "Id"); 
    } 

    public void Accept(IAcceptanceCriteria<IJoinedSubclassInspector> criteria) 
    { 
     criteria.Expect(x => x.EntityType == typeof(TaskDownload)); 
    } 
} 

Luego se agregan los Convetion a la configuración:

Fluently.Configure() 
    //... 
    .Mappings(m => 
     { 
      m.FluentMappings 
      //... 
      .Conventions.Add<JoinedSubclassIdConvention>(); 
     }); 
+0

Trató su solución y funcionó a las mil maravillas. Gracias por la ayuda. –

+0

Pregunta muy antigua, pero sigue siendo relevante. ¿Por qué esto solo se puede configurar como una convención, y no como un método por mapa? – shortstuffsushi

Cuestiones relacionadas