nhibernate сохранение словаря в троичном отношении - PullRequest
0 голосов
/ 11 февраля 2011

Класс:

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>

Когда я выполняю код ниже, я вижу строку, вставленную в таблицу track_people_role, как 47637,10,1

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

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

после того, как при выполнении предыдущего с другой ролью я получаю сообщение «Элемент с тем же ключом уже добавлен» ошибка

    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 */

1 Ответ

0 голосов
/ 12 февраля 2011

Правильное сообщение об ошибке: вы добавляете дубликат ключа в словарь.

Он даже не прибывает из NHibernate - он генерируется классом Dictionary.

Если Track может иметь одинаковые Person в более чем одном Role, вам придется сопоставить таблицу track_person_role как сущность:

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>

Есть более подробная информация о inverse и cascade, но начните с этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...