流畅的Nhibernate映射继承/子类

时间:2012-03-02 00:50:10

标签: c# nhibernate inheritance mapping fluent

我是(流利的)NHibernate的新手并且有一个问题:

我有以下类结构:

<!-- language: c# -->
public class JAccount
{
    public virtual long Id { get; private set; }
    //some properties
    public virtual JProfile Profile { get; set; }
}
public class JProfile
{
    public virtual long Id { get; set; }
   //some more properties
    public virtual int Age { get; set; }

}

我映射了那些工作正常的课程。

<!-- language: c# -->
public class JProfileMap : ClassMap<JProfile>
{
    public JProfileMap()
    {
        Id(x => x.Id).Unique().GeneratedBy.Assigned();
        //some more property mappings

    }
}

然后我想,我在这些实体类中有很多逻辑(方法),我想为每个实体创建一个新的类,继承自基类并将所有逻辑存储到其中。 所以我做了类似的事情:

<!-- language: c# -->
public class TestAccount : JAccount
{
  //all properties which did not need to be mapped into the DB
  //as well as methods
}
//did the same for JProfile

问题是,当我从数据库加载JAccount并将其转换为TestAccount时 并尝试保存它,我得到一个例外,因为FluentHibernate没有TestAcccount的映射

我的问题是:我真的需要SubClassMap这个新类吗?我不希望/需要将它们映射到数据库中,因为他们所做的就是从其基类中取出logik。有没有不同的方法来完成这个?

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

对象的类型一个应该存储在数据库中的重要信息。这就是为什么存在SubclassMapping的最重要原因。

您可以使用策略模式来分离逻辑

,而不是继承JAccount
public class JAccount
{
    private AcountType _type;

    public JAccount(AcountType type)
    {
        _type = type;
    }

    public virtual long Id { get; private set; }
    //some properties
    public virtual JProfile Profile { get; set; }

    public void Register()
    {
        _type.Register(this);
    }
}

// in JAccountMap
    References(Reveal.Member<JAccount>("_type")).Access.Field().Not.LazyLoad();
    // or
    Map(Reveal.Member<JAccount>("_type"), "type").CustomType<AccountTypeToStringUserType>();