我有一个应用程序,它有一个带有我需要继承的基类的核心程序集。我需要将它们保存到数据库中,在阅读完NHibernate后决定使用它。
但是我的一个新继承类有一个问题。我已经设置了子类映射但是当我保存时,它既没有尝试保存它的任何基类属性,也没有尝试保存我已分配的任何新类。映射!
我的课程布局如下:(来自一个小型演示应用程序)
核心组件 DataItem - >用户
任何触及数据库的东西都会继承DataItem类,因为它处理id,修改日期等等。
在我的测试中,我将用户设置为只有FirstName ..
如果我保存一个新用户,那就很好..但是当我从用户继承然后添加另一个名为LastName的属性并尝试保存这个新对象时......它只将一个sql语句放在一起INSERT INTO t_User(id) VALUES(?)..它不会尝试保存名字或姓氏..虽然两者都已设置并已映射。
我的nhibernate.config:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory name="DAL">
<property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="adonet.batch_size">16</property>
<property name="current_session_context_class">web</property>
<property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
<mapping assembly="DAL"/>
<mapping assembly="NHibernateDemo"/>
</session-factory>
</hibernate-configuration>
正如您所看到的,我有2个程序集..我的DAL是我的核心,NHibernateDemo是一个使用核心进行继承的Web应用程序。
我的核心DataItem映射:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DAL" namespace="DAL.Model">
<class name="DataItem" table="t_DataItem" >
<id name="Id">
<generator class="native" />
</id>
<discriminator column="typeid" type="System.Int32"></discriminator>
<property name="IsActive" column="isActive" not-null="true" />
<property name="TypeId" column="typeId" not-null="true"></property>
<many-to-one name="Parent" column="ParentId" class="DataItem"></many-to-one>
<bag name="Children" cascade="all-delete-orphan">
<key column="ParentId"></key>
<one-to-many class="DataItem"/>
</bag>
<joined-subclass name="User" table="t_Users">
<key column="id"></key>
<property name="FirstName" column="firstName" not-null="true" ></property>
</joined-subclass>
<joined-subclass name="Email" table="t_Emails">
<key column="emailid"></key>
<property name="Address" column="Address"></property>
</joined-subclass>
</class>
</hibernate-mapping>
我继承的NewUser映射不起作用!:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernateDemo" namespace="NHibernateDemo.Model">
<subclass name="NewUser" extends="DAL.Model.User, DAL" discriminator-value="1">
<property name="LastName" column="LastName"></property>
</subclass>
为什么当我尝试保存我的类NewUser时,它不会尝试保存任何其他属性集,无论是从它的基础还是新声明的属性?
我真的很感激对此有任何帮助或见解。我一定很遗憾,我只是看不到它。
谢谢,
麦克
答案 0 :(得分:1)
可能是您无法在同一个类层次结构中混合子类和连接子类映射。由于您的DataItem和User与join-subclass相关,您可能需要使NewUser类成为User的另一个join-subclass。
另一个问题可能是在当前的NewUser映射中使用“discriminator”。鉴别器应该是您的用户表中的一个附加列,NHibernate用它来表示用户记录和NewUser记录之间的区别。我不确定这是否适用于用户基类可能没有指定其鉴别器值,而NewUser确实如此。我不确定你是否在任何地方指定了鉴别器列,这可能也是一个问题。
我建议首先尝试使NewUser成为User的连接子类。