c# - net - Fluidez NHibernate, mapeo de subclases unidos
nhibernate vb net example (5)
Intento mapear un escenario de subclases unidos usando Fluidez NHibernate. Tengo una entidad de clase definida en el espacio de nombres Core y una clase SubClass: Entity en el espacio de nombres SomeModule
Ahora, obviamente, no quiero que la entidad de la clase conozca sus tipos derivados, el espacio de nombres SomeModules hace referencia al núcleo, y no al revés.
Todos los ejemplos que he podido encontrar usan 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 funcionará en mi situación. Necesito algo similar al mapeo 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?
Magnus, estaba teniendo exactamente el mismo tipo de problema, y tu sugerencia lo resolvió.
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.
Ese ejemplo anterior es mapear una Id, así que supongo que es una identificación diferente para el valor en el que la base y la subclase se unen, de lo contrario comenzarías a ver los errores de SqlParameterCollection.
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);
});
}
}
Espero eso ayude
Perdón por tu comentario, encontré esto
public class SubClassMap : JoinedSubClassPart< SubClass >
{
public SubClassMap()
: base("SubClassId")
{
Map(x => x.Name);
Map(x => x.SomeProperty);
}
}
Espero que ayude si no lo has resuelto ya.
Magnus (o Premio),
¿Has descubierto cómo usar ese último ejemplo en la clase de mapeo padre? Esto funcionó para mí, pero no me gusta crear yo mismo el 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
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 que KeyColumn solo es necesario si es diferente de ''Baseclassname_id''
Nota: También debe haber un ClassMap<SomeBaseClass>
para la clase base que se extiende SomeSubClass.