流利的NHibernate自动映射与鉴别 [英] Fluent NHibernate AutoMapping with discriminator

查看:135
本文介绍了流利的NHibernate自动映射与鉴别的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图用鉴别器映射继承,但是子类没有鉴别器值。如何使用AutoMappings解决它?



域对象如下:

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

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


$ b $ p

配置如下所示:

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

映射的结果是:

<$ p $ < class xmlns =urn:nhibernate-mapping-2.2name =Solution.Core.Products.Item,Solution.Core,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = 2e5ef41be3839ad7table = `Item`>
< column name =Id/>
< generator class =guid.comb/>
< / id>
< discriminator type =String>
< column name =Discriminator/>
< / discriminator>
< 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>


解决方案

b
$ b

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

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

#endregion

#region IConventionAcceptance< ISubclassInspector>成员
$ b $ public void Accept(IAcceptanceCriteria< ISubclassInspector> criteria)
{
criteria.Expect(subclass => Type.GetType(subclass.Name).BaseType == typeof发票));
}

#endregion
}

这种情况下,我有SalesInvoice类派生自Invoice类。当前子类从发票派生时,子类的接受标准为true。鉴别器值是根据子类的类型分配的。
正如你所看到的,我使用名称来比较类型。不幸的是由于某种原因,subclass.EntityType属性在运行时为null,所以我无法直接比较类型。


I'm trying to map inheritance with discriminator, but subclasses don't have discriminator value. How to solve it using AutoMappings?

Domain objects are as following:

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

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

Configuration looks like:

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

Outcome of mappings are:

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

解决方案

I found that this works:

    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 this scenario I have SalesInvoice class deriving from Invoice class. The acceptance criteria for subclass is true when current subclass derives from Invoice. Discriminator value is assigned based on type of subclass. As you can see, I compare types using names. Unfortunately for some reason subclass.EntityType property is null at runtime so I'm unable to compare types directly.

这篇关于流利的NHibernate自动映射与鉴别的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆