Во-первых, я думаю, что вам нужно иметь два свойства «многие к одному» в вашем классе InfoValue. Это будет выглядеть так:
class InfoValue
{
public virtual User User { get; set; }
public virtual InfoKey Key { get; set; }
public virtual String Value { get; set; }
}
Ваше отображение будет выглядеть примерно так:
<class name="InfoValue" table="[user_info]">
<composite-id>
<key-many-to-one name="User" column="[user]" lazy="proxy" class="User" />
<key-many-to-one name="Key" column="[info_key]" lazy="proxy" class="InfoKey" />
</composite-id>
<property name="Value" column="[info_value]" />
</class>
Пример взят и адаптирован отсюда: Composite-id с множеством к одному
----- Возможно, нежелательный совет -----
Во-вторых, если я могу быть настолько смелым, чтобы дать какой-то совет, не делайте этого. Я имею в виду структуру вашей таблицы. Если мое предположение неверно, не стесняйтесь игнорировать мой совет.
Я предполагаю, что вы хотите поместить информацию о пользователе в дополнительную таблицу, чтобы избежать необходимости изменять структуру таблицы, если и когда требуются новые свойства. Если это и есть причина, я могу честно сказать вам по собственному опыту, что это приведет к сильной головной боли. Помимо проблемы с производительностью при запросе таблиц, все остальное также будет намного сложнее. Ваш пример вставки значений говорит сам за себя. Любые запросы, где вы ищете эти свойства, будут просто плохими. Что вы будете делать, если хотите сохранить что-либо, кроме строк? Приведение к int, DateTime, bool и т. Д .?
Я мог бы продолжать и продолжать здесь, но, если вы абсолютно не сможете изменить структуру таблицы позже, пожалуйста, не занимайтесь этой идеей.