1

継承する必要がある基本クラスを含むコア アセンブリを持つアプリケーションがあります。これらをデータベースに保存する必要があり、NHibernate について読んだ後、それを使用することにしました。

ただし、新しく継承したクラスの 1 つに問題があります。サブクラス マップをセットアップしましたが、保存すると、基本クラスのプロパティも、マッピングで割り当てた新しいプロパティも保存されません。

私のクラスは次のようにレイアウトされています: (小さなデモアプリから)

コア アセンブリ DataItem -> ユーザー

データベースに触れるものはすべて、ID、変更日などを処理するため、DataItem クラスを継承します。

私のテストでは、FirstName のみを持つようにユーザーをセットアップしました。

新しいユーザーを保存するとうまくいきます..ただし、ユーザーから継承してから、LastName という別のプロパティを追加し、この新しいオブジェクトを保存しようとすると.. 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 を保存しようとすると、基本プロパティまたは新しく宣言されたプロパティから、他のプロパティ セットを保存しようとしないのはなぜですか?

これに対する助けや洞察を本当に感謝します..本当に単純なものが欠けているに違いなく、それを見ることができません。

ありがとう、

マイク

4

1 に答える 1

1

サブクラスと結合サブクラスのマッピングを同じクラス階層に混在させることができない可能性があります。DataItem と User は結合サブクラスによって関連付けられているため、NewUser クラスを User の別の結合サブクラスにする必要がある場合があります。

別の問題として、現在の NewUser マッピングでの「識別子」の使用が考えられます。識別子は、NHibernate が User レコードと NewUser レコードの違いを示すために使用する User テーブルの追加の列である必要があります。User 基本クラスが識別子の値を指定しない可能性がある場合にこれが機能するかどうかはわかりませんが、NewUser は指定します。discriminator-column をどこかに指定しているかどうかはわかりませんが、これも問題になる可能性があります。

最初に NewUser を User の結合サブクラスにすることをお勧めします。

于 2009-11-08T22:50:46.453 に答える