Несоответствие типов классов составных ключей nHibernate - PullRequest
2 голосов
/ 25 августа 2009

У меня есть устаревшая таблица с составными ключами, которые сопоставлены с 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

Пожалуйста, сообщите, что я сделал неправильно или пропустил.

Спасибо большое!

1 Ответ

5 голосов
/ 25 августа 2009

Если вы собираетесь использовать ключ-многие-к-одному, вы должны поместить класс:

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 ...
}

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

...