2011-02-11 4 views
0

등급 :NHibernate에

class Track 
{ 
    ... 
    public virtual IDictionary<People, Role> PeopleRoles { get; set; } 
} 

매핑 :

<class name="Track" ...> 
    ... 
    <map name="PeopleRoles" table="track_people_role"> 
    <key column="track_id"/> 
    <map-key-many-to-many column="people_id" class="People"/> 
    <many-to-many column="role_id" class="Role"/> 
    </map> 
</class> 

나는 47637,10,1로 track_people_role 테이블에 삽입 된 행을 볼 수 있습니다 아래의 코드를 실행하면

Person p = PersonManager.GetById(10); 
    Role pr = RoleManager.GetById(1); 
    Track t = TrackManager.GetById(47637); 

    t.PeopleRoles.Add(p, pr); 
    TrackManager.Save(t); 

다른 역할을 사용하여 이전을 실행할 때 "동일한 키를 가진 항목이 이미 있습니다. y가 추가되었습니다 "오류

Person p = PersonManager.GetById(10); 
    Role pr = RoleManager.GetById(2); 
    Track t = TrackManager.GetById(47637); 

    t.PeopleRoles.Add(p, pr); 
    TrackManager.Save(t); 

어떻게하면 두 번째 행을 삽입 할 수 있는지 아이디어가 있습니다.

편집 :
매핑 :

<class name="TrackPersonRole, App.Data" table="trackpeoplerole" lazy="true"> 
    <composite-id> 
    <key-many-to-one name="Person" class="Person" column="people_id"/> 
    <key-many-to-one name="Role" class="Role" column="role_id"/> 
    </composite-id> 
</class> 

<class name="Track" ...> 
... 
<bag name="TrackPeopleRoles"> 
    <key column="track_id"/> 
    <one-to-many class="TrackPersonRole"/> 
</bag> 
</class> 


    TrackPersonRole tpr = new TrackPersonRole(); 
    tpr.Person = PersonManager.GetById(10); 
    tpr.Role = RoleManager.GetById(2); 
    entity.PeopleRoles.Add(tpr); 
    TrackManager.SaveOrUpdate(entity); 

대신 삽입의, 아래의 업데이트 문을 생성합니다.

UPDATE trackpeoplerole SET track_id = 47637 /* ?p0 */ 
WHERE people_id = 10 /* ?p1 */ AND role_id = 2 /* ?p2 */ 

답변

0

오류 메시지가 정확합니다. 중복 키를 사전에 추가하고 있습니다.

심지어 NHibernate에서 온 것도 아니며, Dictionary 클래스에서 생성됩니다.

class Track 
{ 
    ... 
    public virtual ICollection<TrackPersonRole> PeopleRoles { get; set; } 
} 

class TrackPeopleRole 
{ 
    public virtual Person Person { get; set; } 
    public virtual Role Role { get; set; } 
} 

매핑 :

<class name="Track" ...> 
    ... 
    <bag name="TrackPeopleRoles"> 
    <key column="track_id"/> 
    <one-to-many class="TrackPersonRole"/> 
    </map> 
</class> 

더가되는 Track 하나 이상의 Role에서 같은 Person을 가질 수있는 경우

, 당신은 엔티티로 track_person_role 테이블을 매핑해야합니다 inversecascade에 대한 세부 정보가 있지만이 부분부터 시작하십시오.

+0

나는 내 질문을 편집했습니다. 이제 insert 대신 update 문을 얻습니다. – Guray