5

Diskriminatör ile kalıtımı eşleştirmeye çalışıyorum ancak alt sınıfların diskriminatör değeri yoktur. AutoMappings kullanarak nasıl çözülür?Fluent NHibernate Diskriminator ile AutoMapping

Alan nesneleri aşağıdaki gibidir:

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

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

Yapılandırma benziyor: eşleme

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

Sonucuna şunlardır:

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

cevap

7

umarım bu işe bulundu:

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 
} 

Bu senaryoda, Invoice sınıfından türeyen SalesInvoice sınıfına sahibim. Alt sınıf için kabul kriterleri, mevcut alt sınıf Faturadan geldiğinde doğrudur. Ayırımcı değeri, alt sınıfın türüne göre atanır. Gördüğünüz gibi, adları kullanarak türleri karşılaştırıyorum. Ne yazık ki bazı nedenlerle subclass.EntityType özelliği çalışma zamanında null yani doğrudan türleri karşılaştırmak mümkün değildir.

İlgili konular