문제

Fluent NHibernate를 사용하고 있는데 내 수업 중 하나와 다대다 관계를 설정하는 데 몇 가지 문제가 있습니다.아마 어리석은 실수일지도 모르지만 나는 그것을 작동시키려고 잠시 동안 멈춰 있었습니다.어쨌든 다대다 관계를 갖는 두 개의 클래스가 있습니다.

public class Person
{
    public Person()
    {
        GroupsOwned = new List<Groups>();
    }

    public virtual IList<Groups> GroupsOwned { get; set; }
}

public class Groups
{
    public Groups()
    {
        Admins= new List<Person>();
    }

    public virtual IList<Person> Admins{ get; set; }
}

이렇게 매핑하면

사람:...

HasManyToMany<Groups>(x => x.GroupsOwned)
    .WithTableName("GroupAdministrators")
    .WithParentKeyColumn("PersonID")
    .WithChildKeyColumn("GroupID")
    .Cascade.SaveUpdate();

여러 떼:...

 HasManyToMany<Person>(x => x.Admins)
    .WithTableName("GroupAdministrators")
    .WithParentKeyColumn("GroupID")
    .WithChildKeyColumn("PersonID")
    .Cascade.SaveUpdate();

통합 테스트를 실행하면 기본적으로 새로운 사람과 그룹이 생성됩니다.Person.GroupsOwned에 그룹을 추가합니다.저장소에서 Person 개체를 다시 가져오면 GroupsOwned는 초기 그룹과 동일하지만 Group.Admins에서 개수를 확인하면 그룹을 다시 가져오면 개수가 0입니다.Join 테이블에는 GroupID와 PersonID가 저장되어 있습니다.

조언을 보내주셔서 감사합니다.

도움이 되었습니까?

해결책

테이블에 두 개의 레코드를 추가한다는 사실은 역속성.개인과 그룹이 모두 변경되기 때문에 NHibernate는 관계를 두 번(각 객체에 대해 한 번씩) 유지합니다.inverse 속성은 특히 이를 방지하기 위한 것입니다.

코드 매핑에 추가하는 방법은 잘 모르겠지만 링크에서는 XML로 추가하는 방법을 보여줍니다.

다른 팁

@Santiago 당신 말이 맞는 것 같아요.

대답은 단순히 ManyToMany 선언 중 하나를 제거해야 한다는 것일 수 있습니다. Fluent를 자세히 살펴보면 이 작업을 수행할 만큼 충분히 똑똑해 보입니다.

Groups.Admin에 개인을 추가하시겠습니까?두 링크를 모두 만들어야 합니다.

테이블이 3개 있죠?

사람, 그룹 및 그룹 관리자

양쪽에 더하면

사람 (P1의 ID 포함) 그룹 (G1의 ID 포함)

GroupAdministrators에는 두 개의 열과 다음이 포함된 테이블이 있습니다.

(p1,g1)

(p1,g1)

단위 테스트 코드는 다음과 같습니다.

Context hibContext //Built here
Transaction hibTrans //build and start the transaction.

Person p1 = new Person()
Groups g1 = new Groups()

p1.getGroupsOwned().add(g1)
g1.getAdmins().add(p1)

hibTrans.commit();
hibContext.close();

그런 다음 테스트에서 새로운 컨텍스트를 만들고 컨텍스트에 무엇이 있는지 테스트하여 올바른 결과를 얻었지만 테이블이 모두 엉망이 되었습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top