我是(流利的)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。有没有不同的方法来完成这个?
感谢您的帮助
答案 0 :(得分:0)
对象的类型是一个应该存储在数据库中的重要信息。这就是为什么存在SubclassMapping的最重要原因。
您可以使用策略模式来分离逻辑
,而不是继承JAccountpublic 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>();