Сохранение данных в таблицу без первичного ключа - PullRequest
0 голосов
/ 19 марта 2011

У меня есть схема, которая выглядит следующим образом

Пользователь

Id INT
Username VARCHAR(100)
Password VARCHAR(100)

User_Info_Key

Id INT
Description VARCHAR(100)

User_Info

User INT
Info_Key INT
Info_Value VARCHAR(100)
PRIMARY KEY(User, Info_Key)

Вот мой пользовательФайл сопоставления:

<class name="User" table="[user]">
  <id name="Id">
    <column name="id" />
    <generator class="native" />
  </id>
  <property name="Username" />
  <property name="Password" />
  <bag name="InfoValues" cascade="all" lazy="false">
    <key column="[user]" />
    <one-to-many class="FMInfoValue" />
  </bag>
</class>

<class name="InfoKey" table="[user_info_key]">
  <id name="Id">
    <column name="id" />
    <generator class="native" />
  </id>
  <property name="Description" />
</class>

<class name="InfoValue" table="[user_info]">
  <composite-id>
    <key-property name="User" column="[user]" type="int"></key-property>
    <key-property name="Key" column="[info_key]" type="int"></key-property>
  </composite-id>
  <property name="Value" column="[info_value]" />
  <many-to-one name="FMInfoKey" class="FMInfoKey"
             column="[info_key]"
             cascade="all"
             lazy="false" />
</class>

Когда я создаю нового пользователя, я делаю это:

User newuser = new User();
newuser.Username = this.Username;
newuser.Password = this.Password;
session.Save(newuser);

И это сохраняет базовую информацию.

Но когда я пытаюсь добавить имя (значение информационного ключа 1) и фамилию (значение информационного ключа 2), в базу данных ничего не сохраняется:

InfoValue userfname = new InfoValue();
InfoKey userfnamekey = new InfoKey();
userfnamekey.Id = 1;
userfname.InfoKey = userfnamekey;
userfname.Key = 1;
userfname.User = (int) newuser.Id;
userfname.Value = this.Firstname;
session.Save(userfname);

InfoValue userlname = new InfoValue();
InfoKey userlnamekey = new InfoKey();
userlnamekey.Id = 2;
userlname.InfoKey = userlnamekey;
userlname.User = (int)newuser.Id;
userlname.Value = this.Lastname;
session.Save(userlname);

Как получитьNHibernate для сохранения двух информационных значений в таблицу информационных значений?

1 Ответ

2 голосов
/ 21 марта 2011

Во-первых, я думаю, что вам нужно иметь два свойства «многие к одному» в вашем классе 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 и т. Д .?

Я мог бы продолжать и продолжать здесь, но, если вы абсолютно не сможете изменить структуру таблицы позже, пожалуйста, не занимайтесь этой идеей.

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