C# Fluenthibernate映射继承/子类

C# Fluenthibernate映射继承/子类,c#,nhibernate,inheritance,mapping,fluent,C#,Nhibernate,Inheritance,Mapping,Fluent,我是(流利)NHibernate的新手,有一个问题: I.以下班级结构: <!-- language: c# --> public class JAccount { public virtual long Id { get; private set; } //some properties public virtual JProfile Profile { get; set; } } public class JProfile { public vir

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

I.以下班级结构:

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

}

公共类计数
{
公共虚拟长Id{get;private set;}
//一些性质
公共虚拟JProfile配置文件{get;set;}
}
公共类JProfile
{
公共虚拟长Id{get;set;}
//更多属性
公共虚拟整数{get;set;}
}
我绘制了那些运行良好的类

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

    }
}

公共类JProfileMap:ClassMap
{
公共JProfileMap()
{
Id(x=>x.Id).Unique().GeneratedBy.Assigned();
//更多属性映射
}
}
然后我想,我在这些实体类中有很多逻辑(方法),我想为每个实体类创建一个新类,继承基类,并将所有逻辑存储到其中。 所以我做了一些类似的事情:

<!-- 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
{
//不需要映射到数据库中的所有属性
//以及方法
}
//对JProfile也做了同样的事情
现在的问题是,当我从数据库加载JAccount并将其转换为TestAccount时 为了保存它,我得到了一个异常,因为FluentHibernate没有TestAccount的映射

我现在的问题是:我真的需要对这个新类进行子类映射吗?我不希望/需要将它们映射到数据库中,因为它们所做的只是从其基类中取出logik。有没有其他方法可以做到这一点


感谢您的帮助

对象的类型应存储在数据库中的重要信息。这就是为什么存在子类映射的最重要原因

您可以使用策略模式来分离逻辑,而不是继承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>();
公共类计数
{
私有帐户类型_类型;
公共计数(A计数类型)
{
_类型=类型;
}
公共虚拟长Id{get;private set;}
//一些性质
公共虚拟JProfile配置文件{get;set;}
公开作废登记册()
{
_类型。寄存器(本);
}
}
//在JAccountMap中
引用(leaver.Member(“_type”)).Access.Field().Not.LazyLoad();
//或
映射(leaver.Member(“_type”),“type”).CustomType();

不可能实例化
JAccount
并将其强制转换为
TestAccount
。你能澄清一下你在这里做什么吗?就像我说的,我想让映射的基类尽可能简单。只有属性,还有一个从基类继承的类,它实现了所有其他东西,比如方法。所以我有一个
TestAccount
类,它继承了
JAccount
Register()等方法
但是这些类没有映射,因为它们没有需要存储在数据库中的属性/信息,它们仅使用方法扩展基类…但是我在尝试更新/保存这些类时从fluenthibernate得到错误,并实例说明这些类没有映射:(你可以用另一种方法,告诉nhibernate忽略基类,例如
Profile:Entity
,告诉nhibernate忽略
Entity
,但是有没有一种方法可以实现oposite、ignore Profile和save/cast to Entity?=在大多数情况下,这是正确的,但我尝试的是拥有一个表示表的类。)(仅限物业)并且被映射,第二个类继承了这些属性,其中包含所有逻辑内容,但没有映射到数据库..但是我猜我想做的尝试是错误的/逻辑错误的…如果有多个继承类,你怎么知道在映射类上应用哪个类?如果它是数据库中的一列,你可以只需映射层次结构就可以了