tutorial net mvc example ejemplo asp c# .net nhibernate fluent-nhibernate orm

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.