连接子类问题的NHibernate子类
我有一个应用程序,它有一个核心程序集,需要从中继承基类。。我需要将这些保存到数据库中,在阅读了有关NHibernate的内容后,我决定使用它 但是,我的一个新继承类有一个问题。。我已经设置了子类映射,但是当我保存时,它既不尝试保存它的任何基类属性,也不尝试保存我在映射中指定的任何新属性 我的课程安排如下:(来自一个小的演示应用程序) 堆芯组件 数据项->用户 任何与数据库相关的操作都会继承DataItem类,因为它会处理id、修改日期等 在我的测试中,我将用户设置为只有名字 如果我保存了一个新用户,效果会很好。。但是,当我从用户继承,然后添加另一个名为LastName的属性并尝试保存此新对象时。。它只将INSERT的sql语句组合到t_用户(id)值(?)。。它不会尝试保存名字或姓氏。。尽管两者都已设置并已映射,但也可以 我的nhibernate.config:连接子类问题的NHibernate子类,nhibernate,subclass,joined-subclass,Nhibernate,Subclass,Joined Subclass,我有一个应用程序,它有一个核心程序集,需要从中继承基类。。我需要将这些保存到数据库中,在阅读了有关NHibernate的内容后,我决定使用它 但是,我的一个新继承类有一个问题。。我已经设置了子类映射,但是当我保存时,它既不尝试保存它的任何基类属性,也不尝试保存我在映射中指定的任何新属性 我的课程安排如下:(来自一个小的演示应用程序) 堆芯组件 数据项->用户 任何与数据库相关的操作都会继承DataItem类,因为它会处理id、修改日期等 在我的测试中,我将用户设置为只有名字 如果我保存了一个新用
<?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>
NHibernate.dialogue.mssql2005dialogue
NHibernate.Connection.DriverConnectionProvider
NHibernate.Driver.SqlClientDriver
16
网状物
NHibernate.ByteCode.Castle.proxyFactory,NHibernate.ByteCode.Castle
如你所见,我有两个组件。。我的DAL是我的核心,NHibernateDemo是一个使用核心进行继承的web应用程序
我的核心数据项映射:
<?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时,它不尝试保存任何其他属性集,无论是从它的基属性还是新声明的属性
我真的非常感谢任何对这方面的帮助或见解。。我一定错过了一些非常简单的东西,我就是看不到
谢谢
迈克
可能是您无法在同一类层次结构中混合子类和联接子类映射。由于DataItem和User是通过联接子类关联的,所以可能需要将NewUser类设置为User的另一个联接子类 另一个问题可能是在当前新用户映射中使用“鉴别器”。鉴别器应该是用户表中的附加列,NHibernate使用该列来区分用户记录和新用户记录之间的差异。我不确定在用户基类可能没有指定其鉴别器值的情况下,这种方法是否有效,而NewUser可以。我不确定您是否在任何地方指定了鉴别器列,这可能也是一个问题
我建议首先尝试将NewUser作为User的联接子类。可能是您无法在同一类层次结构中混合使用子类和联接子类映射。由于DataItem和User是通过联接子类关联的,所以可能需要将NewUser类设置为User的另一个联接子类 另一个问题可能是在当前新用户映射中使用“鉴别器”。鉴别器应该是用户表中的附加列,NHibernate使用该列来区分用户记录和新用户记录之间的差异。我不确定在用户基类可能没有指定其鉴别器值的情况下,这种方法是否有效,而NewUser可以。我不确定您是否在任何地方指定了鉴别器列,这可能也是一个问题
我建议首先尝试将NewUser作为User的联接子类。也许我误解了“联接”一词的用法。这是否表示它将在执行select查询时尝试执行联接?我的newuser类将其数据保存在与user类相同的表中。。有一个类型id,但它属于dataitem。。我认为这可能是个问题。我要试试你的建议!!!谢谢你的指导。好的。。我刚刚尝试将我的NewUser映射切换为user的一个连接子类,它仍然尝试使用以下“INSERT into t_Users(id)value(?)保存到我的user表中”…所以它没有试图保存firstname或lastname属性..可能我误解了“joined”一词的用法。这是否表明它将在执行选择查询时尝试执行联接?我的newuser类将其数据保存在与user类相同的表中..有一个类型id,但它属于dataitem..我看到了可能是个问题。我要试试你的建议!!!谢谢你的指导。好的..我刚刚尝试将我的NewUser映射切换为user的一个联接子类,它仍然尝试使用以下“INSERT into t_Users(id)value(?)”保存到我的user表中。。因此,它不会试图保存firstname或lastname属性。。