【发布时间】:2014-12-02 06:38:49
【问题描述】:
我正在使用 Fluent NHibernate,我正在尝试映射一个简单地绕过连接表的多对多属性。棘手的是,连接表有一个列来确定它是什么类型的关系。
对于这个问题,假设我有一个人表和一个关系表。
PersonTable (PersonId, Name, etc)
RelationTable (RelationType, PersonIdA, PersonIdB)
我想在 Person 类中为每种类型的关系引入一个集合属性,例如儿子、女儿等。
HasManyToMany<Person>(x => x.Sons)
.Table("RelationTable")
.ParentKeyColumn("PersonIdA")
.ChildKeyColumn("PersonIdB")
.Where("RelationType='A_IS_FATHER_OF_B_BOY'");
HasManyToMany<Person>(x => x.Daughters)
.Table("RelationTable")
.ParentKeyColumn("PersonIdA")
.ChildKeyColumn("PersonIdB")
.Where("RelationType='A_IS_FATHER_OF_B_GIRL'");
以上映射只用于从数据库中读取,但不适用于插入,例如:
Person john = PersonDAO.GetByName("John"); // the Sons and Daughters are loaded fine based on mappings above
john.Sons.Add(new Person("Jack")); // let's add a new son
PersonDAO.Save(john); // this fails because RelationType is null
基本上,当在 RelationTable 中将 Jack 保存为 John 的新儿子时,我需要将 RelationType 填充为“A_IS_FATHER_OF_B_BOY”,这目前还没有发生。 指令 .Where("RelationType='A_IS_FATHER_OF_B_BOY'") 只对加载有效,对保存无效。
有什么想法吗?我认为这有点类似于子类的鉴别器属性。
任何帮助表示赞赏。谢谢。
【问题讨论】:
-
@RadimKöhler,我已阅读您提供的链接。实际上,我确实将 RelationTable 映射为 2 个对 Person 的多对一引用(作为 PersonA 和 PersonB)。使用一对多(HasMany),那么您如何建议我在 Person 类中映射 Sons 和 Daughters(均为 List
),同时考虑到上面的鉴别器值?谢谢。
标签: c# nhibernate fluent-nhibernate nhibernate-mapping fluent-nhibernate-mapping