5

Ich versuche, Vererbung mit Diskriminator zuordnen, aber Unterklassen haben keinen Diskriminatorwert. Wie löst man es mit AutoMappings?Fließfähiges NHibernate AutoMapping mit Diskriminator

Domain-Objekte sind wie folgt:

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

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

Konfiguration wie folgt aussieht:

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; 
    }); 

Ergebnis der Zuordnungen sind:

<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> 

Antwort

7

fand ich, dass dies funktioniert:

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 
} 

In diesem Szenario habe ich die SalesInvoice-Klasse, die von der Invoice-Klasse abgeleitet ist. Die Akzeptanzkriterien für die Unterklasse sind wahr, wenn die aktuelle Unterklasse von Invoice abgeleitet wird. Der Diskriminatorwert wird basierend auf dem Typ der Unterklasse zugewiesen. Wie Sie sehen können, vergleiche ich Typen mit Namen. Leider ist die Eigenschaft subclass.EntityType aus irgendeinem Grund zur Laufzeit null, daher kann ich Typen nicht direkt vergleichen.

Verwandte Themen