5

Estoy tratando de mapear herencia con discriminator, pero las subclases no tienen valor discriminador. ¿Cómo resolverlo usando AutoMappings?Fluidez NHibernate AutoMapping con discriminator

objetos de dominio son los siguientes:

public abstract class Item : GuidIdentityEntity { 
    public virtual string Name { get; set; } 
} 

public class Product : Item {} 
public class RawMaterial : Item {} 

configuración será similar a:

AssemblyOf<Item>() 
    .IgnoreBase<GuidIdentityEntity>(); 
    .IncludeBase<Item>(); 
    .Setup(setup => { 
     setup.DiscriminatorColumn = type => "Discriminator"; 
     setup.IsDiscriminated = type => type == typeof(Item); 
     setup.SubclassStrategy = type => (type == typeof(Item)) 
      ? SubclassStrategy.Subclass 
      : SubclassStrategy.JoinedSubclass; 
    }); 

Resultado de asignaciones son:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property" auto-import="true" default-cascade="none" default-lazy="true"> 
    <class xmlns="urn:nhibernate-mapping-2.2" name="Solution.Core.Products.Item, Solution.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=2e5ef41be3839ad7" table="`Item`"> 
    <id name="Id" type="System.Guid, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="Id" /> 
     <generator class="guid.comb" /> 
    </id> 
    <discriminator type="String"> 
     <column name="Discriminator" /> 
    </discriminator> 
    <property name="Name" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="Name" /> 
    </property> 
    <subclass name="Solution.Core.Products.RawMaterial, Solution.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=2e5ef41be3839ad7" /> 
    <subclass name="Solution.Core.Products.Product, Solution.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=2e5ef41be3839ad7" /> 
    </class> 
</hibernate-mapping> 

Respuesta

7

He encontrado que esto funciona:

public class SubclassConvention : ISubclassConvention, ISubclassConventionAcceptance 
{ 
    #region IConvention<ISubclassInspector,ISubclassInstance> Members 

    public void Apply(ISubclassInstance instance) 
    { 
     if (instance.Name == typeof(SalesInvoice).AssemblyQualifiedName) 
      instance.DiscriminatorValue("SAL"); 
    } 

    #endregion 

    #region IConventionAcceptance<ISubclassInspector> Members 

    public void Accept(IAcceptanceCriteria<ISubclassInspector> criteria) 
    { 
     criteria.Expect(subclass => Type.GetType(subclass.Name).BaseType == typeof(Invoice)); 
    } 

    #endregion 
} 

En este caso tengo la clase SalesInvoice que se deriva de la clase de factura. El criterio de aceptación para la subclase es verdadero cuando la subclase actual se deriva de la Factura. El valor del discriminador se asigna en función del tipo de subclase. Como puede ver, comparo tipos usando nombres. Desafortunadamente, por alguna razón, la propiedad subclass.EntityType es nula en el tiempo de ejecución, por lo que no puedo comparar los tipos directamente.

Cuestiones relacionadas