C# Fluenthibernate映射继承/子类
我是(流利)NHibernate的新手,有一个问题: I.以下班级结构: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
<!-- 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?=在大多数情况下,这是正确的,但我尝试的是拥有一个表示表的类。)(仅限物业)并且被映射,第二个类继承了这些属性,其中包含所有逻辑内容,但没有映射到数据库..但是我猜我想做的尝试是错误的/逻辑错误的…如果有多个继承类,你怎么知道在映射类上应用哪个类?如果它是数据库中的一列,你可以只需映射层次结构就可以了