저는 Fluent NHibernate를 사용하고 있으며, 단순히 join 테이블을 우회하는 다 대다 속성을 매핑하려고합니다. 까다로운 점은 조인 테이블에 어떤 유형의 관계가 있는지 결정하는 열이 있다는 것입니다.Fluent NHibernate hasManyToMany discriminator column이 관계 타입을 지정합니다.
이 질문의 목적을 위해 사람 테이블과 관계 테이블이 있다고 가정 해 봅니다.
각 관계 유형에 대해 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 I 존의 새로운 아들로 잭을 저장할 때 현재 발생하지 않는 RelationType을 "A_IS_FATHER_OF_B_BOY"로 채워야합니다. 지시문 .Where ("RelationType = 'A_IS_FATHER_OF_B_BOY'")는로드에만 유효하지만 저장에는 유효하지 않습니다.
아이디어가 있으십니까? 나는 이것이 하위 클래스의 Discriminator 속성과 다소 비슷하다고 생각한다.
도움을 주시면 감사하겠습니다. 감사.
* 답변을 얻으려면 가능한 경우 many-to-many를 피하는 것이 좋습니다. 당신이 좋아한다면, 더 읽기 [여기] (http://stackoverflow.com/a/21136089/1679310) 또는 [여기] (http://stackoverflow.com/a/16827671/1679310) * –
@ RadimKöhler, 나는 읽었다. 제공 한 링크를 통해 필자는 실제로 RelationTable을 Person에 대한 2 개의 다 대일 참조 (PersonA와 PersonB)로 매핑했습니다. 일대 다 (HasMany)를 사용하여, 어떻게 위에서와 같은 판별 자 값을 고려하여 Person 클래스의 Sons and Daughters (둘 다 List)를 매핑하는 것이 좋습니다. 감사. –