Однонаправленная вставка «многие ко многим» с использованием динамического сеанса в NHibernate - PullRequest
0 голосов
/ 05 января 2012

У меня есть файл "AnagraficaBase" hbm:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class entity-name="AnagraficaBase" table="anagrafica">
<id name="ID" type="int" >
  <column name="ID" not-null="true" />
  <generator class="identity" />
</id>
<property name="Email" type="string" >
  <column name="Email" sql-type="varchar(255)" not-null="true" />
</property>
<one-to-one cascade="all" class="NetCms.Users.User" property-ref="AnagraficaMapped" name="User" />
<joined-subclass entity-name="Anagraficaprova" table="anagrafica_prova" >
  <key>
    <column name="id_anagrafica_prova" />
  </key>
  <property name="data di nascita" type="DateTime">
    <column name="data_di_nascita" sql-type="DateTime" not-null="true" />
  </property>
  <property name="nome" type="string">
    <column name="nome" sql-type="varchar(25)" not-null="true" />
  </property>
  <property name="dropdown test" type="string">
    <column name="dropdown_test" sql-type="varchar(255)" not-null="true" />
  </property>
  <bag name="profilo" table="anagrafica_prova_custom_field_checkboxlist_values" cascade="all" fetch="select">
    <key>
      <column name="IDanagrafica_prova" not-null="true" />
    </key>
    <many-to-many entity-name="CustomCheckboxListValue">
      <column name="IDcustom_field_checkboxlist_value" not-null="true" />
    </many-to-many>
  </bag>
</joined-subclass>
</class>
</hibernate-mapping>

Я хочу создать объект "Anagraficaprova" с динамическим сеансом (EntityMode.Map). Как вы можете видеть, у меня есть однонаправленное отношение «многие ко многим» между «Anagraficaprova» и «CustomCheckboxListValue».

Итак, когда я делаю:

ISession mapSession = sess.GetSession(EntityMode.Map);

List<IDictionary> profiles = new List<IDictionary>();
Hashtable profilo1 = (Hashtable) mapSession.get("CustomCheckboxListValue",1);
profiles.add(profilo1);

Hashtable anagraficaProva = new Hashtable();
anagraficaProva.add("Email","test");
anagraficaProva.add("data di nascita", "08/10/1982");
anagraficaProva.add("nome","pippo");
anagraficaProva.add("dropdown test","1");

anagraficaProva.add("profilo", profiles);

mapSession.SaveOrUpdate("Anagraficaprova", anagraficaProva);

Объект anagraficaProva правильно сохранен, но запись в таблице «anagrafica_prova_custom_field_checkboxlist_values» (пара: IDanagrafica_prova, IDcustom_field_checkboxlist_value) не вставлена.

Где проблема?

Спасибо ...

1 Ответ

0 голосов
/ 10 января 2012

В случае, если кто-то еще придет сюда.

NH вставляет AnagraficaBase, потому что он использует identity для получения идентификатора, но помещает вставки в таблицу anagrafica_prova_custom_field_checkboxlist_values, чтобы вставить их за один раз позже.Но прежде чем они будут отправлены в базу данных, сеанс отбрасывается, и поэтому пакетные вставки.

mapSession.Flush(); после того, как SaveOrUpdate указывает NH отправить все ожидающие утверждения.

...