使用 2 种策略通过 fluent nhibernate 映射类层次结构
Posted
技术标签:
【中文标题】使用 2 种策略通过 fluent nhibernate 映射类层次结构【英文标题】:Mapping class hierarchy through fluent nhibernate by using 2 strategies 【发布时间】:2011-12-21 11:22:37 【问题描述】:我想使用流利的 nhibernate 或 nhibernate 本身(我的意思是 hbm 文件)组合每类表和每层次表策略,但我不知道如何。我更喜欢流利而不是 hbm,但如果不可能,那么 hbm 也可以。我通过在 fluent 中引入 Entity 作为 ClassMap 和所有其他作为 SubClassMap 来测试这一点,但是在 fluent 生成的 hbm 文件中,Entity 是一个类,而所有其他都是连接类,这不是我想要的。我将在下面更详细地描述这个问题。
类层次结构:
public class Entity
public int ID get; set;
public string Name get; set;
public abstract class Person : Entity
public string Phone get; set;
public class SystemUser : Person
public string Password get; set;
我想有一张实体表和一张人表以及所有类型的表(所有子类)。我的意思是我想对实体使用每类表策略,对人使用每层次表策略和SystemUser 类。数据库结构是这样的:
EntityTable(ID(PK),Name)
PersonTable(EntityID(PK,FK),Phone,Password)
任何帮助表示赞赏。
【问题讨论】:
【参考方案1】:如果 EntityTable Id 不是数据库生成的(NH 不鼓励这样做),您可以使用该技巧
public PersonMap : ClassMap<Person>
public PersonMap()
Table("PersonTable");
Id(p => p.Id, "EntityID").GeneratedBy.HiLo("100");
DiscriminateSubClassesOnColumn("PersonType");
Map(x => x.Phone);
Join("EntityTable", join =>
join.KeyColumn("ID");
join.Map(p => p.Name);
);
public SystemUserMap : SubclassMap<SystemUser>
public SystemUserMap()
Map(x => x.Password);
【讨论】:
感谢您的回复,但不,这不是我想要的。请看一下数据库结构和两个表。一种用于实体,一种用于各种人员。事实上,人是抽象的。 映射用于发布的表结构。你有一个 Person 的层次结构和一个 SystemUser 的层次结构,但它们都为它们的 name 属性共享 EntityTable。尝试在控制台应用程序中使用SchemaExport(config).Execute(true, false, false)
以了解我的意思
除了我发布的内容之外,我想不出办法,因为 NH 不允许在 <join>
中使用 discriminatetocolumn
根据您的建议,我有 3 个表:Table("SystemUserTable") 和 Table("PersonTable") 和 Join("EntityTable"... 但我只有 2 个表 Entity 和Person 和 SystemUser 转到 person 表。你明白我的意思吗?
好的,更好但再次删除 Table("SystemUserTable");来自 SystemUserMap!这里的重点是 ID 是在 Entity 中生成的,如您所见,我的 Person 类上没有 ID 属性 - 您已经提到过。如果我将它声明为 ClassMap,它需要属于实体表的 ID,如果我将其声明为 SubClassMap,那么我不能使用 DiscriminateSubClassesOnColumn。这就是现在的问题。以上是关于使用 2 种策略通过 fluent nhibernate 映射类层次结构的主要内容,如果未能解决你的问题,请参考以下文章
NHibernate 2 + Fluent Nhibernate 中等信任
Fluent NHibernate - NHibernate.QueryException:无法解析属性
在使用fluent-nhibernate配置nhibernate时,为什么会出现MissingMethodException?