2009-08-25 4 views
2

У меня есть таблица устаревших с составными ключами, которые сопоставлены с тремя другими таблицами, поскольку в этой таблице есть другие атрибуты, так как это не простая таблица сопоставления, я не могу использовать многие -to-many, чтобы отобразить это.nHibernate Composite Key Тип класса Несоответствие

Ниже то, что я сделал:

<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 все определяются как междунар в их соответствующем классе.

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: ID ожидаемый тип AKEY, фактический тип System.Int32

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

Спасибо!

ответ

5

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

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

В противном случае, если вы хотите, Id просто сопоставить их как свойства CLASSA:

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

+0

Спасибо за ваш ответ! Последняя часть помогла мне решить мою проблему, теперь я могу, наконец, двигаться дальше! = P – Akey

+0

Yah ... Я понял после того, как написал, что последний должен был первым! – anonymous

Смежные вопросы