2008-11-25 13 views
8

Estoy tratando de mapear un escenario de subclases unidos usando Fluent NHibernate. Tengo una Entidad de clase definida en el espacio de nombres Core, y una subclase de clase : Entidad en el espacio de nombres SomeModuleFluido NHibernate, mapeo de subclases unidos

Ahora, obviamente, no quiero Entidad de clase para saber acerca de sus derivados tipos, el SomeModules referencias de espacio de nombres Core - no a la inversa alrededor.

Todos los ejemplos que han sido capaces de encontrar un uso algo como:

public class EntityMap : ClassMap<Entity> { 
    public EntityMap() { 
     Id(x => x.Id) 

     var subClassMap = JoinedSubClass<SubClass>("SubClassId", sub => sub.Map(x => x.Id)); 

     subClassMap.Map(x => x.SomeProperty) 
     ... 
    } 
} 

Esto simplemente no va a funcionar en mi situación - Necesito algo parecido a la asignación NHibernate xml:

<joined-subclass name="SubClass" extends="Entity, Core" > 
<key column="SubClassId" foreign-key="FK_KollegiumEntity"/> 
<property name="Name" length="255" not-null="true" /> 
... 
</joined-subclass> 

¿Alguien ha logrado esto con Fluent NHibernate?

Respuesta

0

Hola hice algo así hace unos días.

public class EntityMap : ClassMap<Entity> { 
public EntityMap() { 
    Id(x => x.Id) 

    JoinedSubClass<SubClass>("SubClassId", sub => { 
      sub.Map(x => x.Name); 
      sub.Map(x => x.SomeProperty); 
    }); 
} 
} 

creo que sirve

+1

Su solución propuesta no resuelve mi problema, que es separar las asignaciones de Entity y SubClass. –

0

Magnus, que estaba teniendo exactamente el mismo tipo de problema, y ​​su sugerencia arreglaron.

El segundo parámetro para JoinedSubClass toma una Acción SubClassPart contra su objeto de tipo SubT. Por lo tanto, solo necesita asignar los campos adicionales en su objeto subclasificado.

El ejemplo anterior es mapear un Id, así que supongo que es una identificación diferente al valor en el que se unen la base y la subclase, de lo contrario comenzaría a ver los errores de SqlParameterCollection.

1

Lo sentimos perdió su comentario, encontraron esta

public class SubClassMap : JoinedSubClassPart<SubClass> 
{ 
    public SubClassMap() 
     : base("SubClassId") 
    { 
     Map(x => x.Name); 
     Map(x => x.SomeProperty); 
    } 
} 

creo que sirve si no se ha resuelto ya.

1

Magnus (o premio),

Te diste cuenta de cómo utilizar ese último ejemplo de la clase padre de mapeo? Esto funcionó para mí, pero no me gusta crear instancias de la misma SubClassMap:

public class EntityMap : ClassMap<Entity> { 
public EntityMap() { 
    Id(x => x.Id) 
    AddPart(new SubClassMap()); // Adds the subclass mapping! 
} 
} 

public class SubClassMap : JoinedSubClassPart<SubClass> 
{ 
    public SubClassMap() 
     : base("SubClassId") 
    { 
     Map(x => x.Name); 
     Map(x => x.SomeProperty); 
    } 
} 

que produjo una consulta similar a:

SELECT 
    this_.Id as Id2_2 
    this_.Name as Name3_2 
    this_.SomeProperty as SomeProperty3_2 
FROM 
    SubClass this_ inner join 
    Entity this_1 on this_.Id=this_1.Id 
+4

Parece que agregar parte ahora es obsoleto ...? – 5x1llz

10

Creo que la API ha cambiado desde que se hizo esta pregunta, pero esto funciona para mí:

public class SomeSubclassMap : SubclassMap<SomeSubclass> { 
    public SomeSubclassMap() 
    { 
     KeyColumn("SomeKeyColumnID"); 
     Map(x => x.SomeSubClassProperty); 
     ... 
    } 
} 

creo KeyColumn sólo es necesaria si es diferente a 'Baseclassname_id'

Nota: También debe haber un ClassMap<SomeBaseClass> para la clase base que se extiende SomeSubClass.

+0

+1 por su buena respuesta.¿Tiene alguna idea de cómo decirle a Fluiber NHibernate que "KeyColumn" se debe unir a la columna "XYZ" en la tabla de la clase base, NO a la columna de la clave principal? –

+0

@Milan: Solo estoy viendo esto, disculpe la lenta respuesta. No conozco una manera de especificar una KeyColumn diferente en el lado de la clase base. La propiedad KeyColumn significa exactamente eso, la columna de la clave principal de la matriz/base. Eché un vistazo a los documentos por si había algo que pudiera haber malinterpretado. –

+0

@MilanGardian ¿alguna vez encontró una respuesta a su pregunta? ¿Puede una subclase volver a su padre, pero sin usar la columna de ID del padre? – ahsteele

Cuestiones relacionadas