Несоответствие типа класса составного ключа nHibernate

У меня есть устаревшая таблица с составными ключами, которые сопоставляются с 3 другими таблицами, поскольку в этой таблице есть другие атрибуты, так как это не простая таблица сопоставления, я не могу использовать решение набора "многие ко многим" для сопоставления этого .

Вот что я сделал:

<class name="classA" table="A">
<composite-id name="ID" class="AKey">
  <key-many-to-one name="Id_one" class="One" column="Id_one" />
  <key-many-to-one name="Id_two" class="Two" column="Id_two" />
  <key-many-to-one name="Id_three" class="Three" column="Id_three" />
</composite-id>

AKey — это просто структура, содержащая три идентификатора, а Id_one, Id_two и Id_three определены как int в соответствующих классах.

public struct Akey {
    public int Id_one { get; set; }
    public int Id_two { get; set; }
    public int Id_three { get; set; }
}

Компилируется нормально, но при попытке запустить выдает сообщение об ошибке:

NHibernate.QueryException : несоответствие типов в NHibernate.Criterion.SimpleExpression: идентификатор ожидаемого типа AKey, фактический тип System.Int32

Посоветуйте, пожалуйста, что я сделал не так или упустил.

Огромное спасибо!


person Akey    schedule 25.08.2009    source источник


Ответы (1)


Если вы собираетесь использовать key-many-to-one, вы должны поместить класс:

public class Akey {
    public virtual One One {get; set;}
    public virtual Two Two {get; set;}
    public virtual Three Three {get; set;}
}

В противном случае, если вам нужен идентификатор, вы просто сопоставляете их как свойства класса A:

 <composite-id>
     <key-property name="Id_one" column="Id_one" />
     <key-property name="Id_two" column="Id_two" />
     <key-property name="Id_three" column="Id_three" />
 </composite-id>

.

public class classA {
    public virtual int Id_one {get; set;}
    public virtual int Id_two {get; set;}
    public virtual int Id_three {get; set;}

    // ... rest of props ...
}

Или как композит, как у вас:

 <composite-id name="ID" class="AKey">
     <key-property name="Id_one" column="Id_one" />
     <key-property name="Id_two" column="Id_two" />
     <key-property name="Id_three" column="Id_three" />
 </composite-id>

.

public class AKey {
    public virtual int Id_one {get; set;}
    public virtual int Id_two {get; set;}
    public virtual int Id_three {get; set;}
}

public class classA {
    public virtual AKey ID {get; set;}

    // ... rest of props ...
}

Ну наконец то ...

 <composite-id>
   <key-many-to-one name="Id_one" class="One" column="Id_one" />
   <key-many-to-one name="Id_two" class="Two" column="Id_two" />
   <key-many-to-one name="Id_three" class="Three" column="Id_three" />
 </composite-id>

.

public class classA {
    public virtual One One {get; set;}
    public virtual Two Two {get; set;}
    public virtual Three Three {get; set;}

    // ... rest of props ...
}

Собираюсь обсудить, можете ли вы использовать структуру, потому что я не разбираюсь в них в С#.

person anonymous    schedule 25.08.2009
comment
Спасибо за ответ! Последняя часть помогла мне решить мою проблему, теперь я наконец могу двигаться дальше! =П - person Akey; 26.08.2009
comment
Да... Я понял после того, как написал это, что последний должен был быть первым! - person anonymous; 26.08.2009