我使用流利NHibernate和我试图映射一个多对多的属性,只是绕过连接表。棘手的是,连接表有一列确定它是什么类型的关系。流利NHibernate的HasManyToMany鉴别器列指定的关系类型
为了这个问题,我们假设我有一个人表和一个关系表。
PersonTable (PersonId, Name, etc)
RelationTable (RelationType, PersonIdA, PersonIdB)
我想在Person类中为每种关系类型引入一个集合属性,例如,节能杰克在RelationTable我约翰的新女婿的时候基本上
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
:儿子,女儿等
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'");
上述映射正在从数据库中读取,但不能用于插入,例如需要将RelationType填充为“A_IS_FATHER_OF_B_BOY”,这种情况目前尚未发生。 指令.Where(“RelationType ='A_IS_FATHER_OF_B_BOY'”)只适用于加载,但不适用于保存。
任何想法?我认为这有点类似于子类的Discriminator属性。
任何帮助表示赞赏。谢谢。
*在您得到您的答案之前,我会建议避免多对多,如果可能的话。如果你喜欢阅读更多[这里](http://stackoverflow.com/a/21136089/1679310)或[这里](http://stackoverflow.com/a/16827671/1679310)* – 2014-12-02 06:50:37
@RadimKöhler,我已阅读通过您提供的链接。我实际上确实将RelationTable与2个多对一引用映射为Person(如PersonA和PersonB)。使用一对多(HasMany),你怎么建议我在Person类中映射儿子和女儿(都列表),同时考虑到上面的鉴别器值?谢谢。 –
2014-12-02 23:13:32