NHibernate 中使用动态会话的单向多对多插入

发布于 2024-12-25 05:14:57 字数 2559 浏览 3 评论 0原文

我有“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>

我想创建一个具有动态会话(EntityMode.Map)的“Anagraficaprova”对象。 如您所见,“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)。

问题出在哪里?

谢谢...

I've the "AnagraficaBase" hbm file:

<?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>

I want to create an "Anagraficaprova" object with dynamic session (EntityMode.Map).
As you can see, I've a unidirectional many to many relation between "Anagraficaprova" and "CustomCheckboxListValue".

So, when I do:

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);

The anagraficaProva object is correctly saved, but the record in "anagrafica_prova_custom_field_checkboxlist_values" table (the couple: IDanagrafica_prova,IDcustom_field_checkboxlist_value) is not inserted.

Where is the problem?

Thank you...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

清眉祭 2025-01-01 05:14:57

万一还有人来到这里。

NH 插入 AnagraficaBase 是因为它使用 identity 来获取 id,但会批量插入到表 anagrafica_prova_custom_field_checkboxlist_values 中,以便稍后一次性插入它们。但在它们发送到数据库之前,会话被丢弃,因此批量插入。

mapSession.Flush(); 在 SaveOrUpdate 告诉 NH 发送所有挂起的语句之后。

In case someone else comes here.

NH inserts AnagraficaBase because it uses identity to get the id but batches the Inserts into table anagrafica_prova_custom_field_checkboxlist_values to insert them in one go later. But before they are sent to db the session is thrown away and therefor the batched Inserts.

mapSession.Flush(); after SaveOrUpdate tells NH to send all pending statements.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文