1

複数のテーブルを持つ継承されたクラス構造があります。私のクラス構造は次のとおりです。(これは実際のクラスではありません。スペースを節約するために、ここで元のクラスを模倣する偽のクラスを作成しました。)

class Account {
    public virtual int AID { get; set; }
    public virtual string Name { get; set; }
    public virtual string Serial { get; set; }
    public virtual string Type { get; set; }

    public Account { Type = "Default"; }
}

class Human : Account {
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    // more properties..

    public Human { Type = "Human"; }
}

class Bank : Account {
    public virtual string BranchName { get; set; }
    // more properties..

    public Bank { Type = "Bank"; }
}

私のAccount.hbm.xmlファイルは次のようになります。

  <class name="Account">
    <id name="AID" type="Int32">
      <generator class="native" />
    </id>
    <discriminator column="Type" type="string" />
    <property name="Name" />
    <property name="Serial" />
    <property name="Type" />

    <subclass name="Human" discriminator-value="Human">
      <join table="Account">
        <key column="AID" />
        <property name="FirstName" />
        <property name="LastName" />
      </join>
    </subclass>

    <subclass name="Bank" discriminator-value="Bank">
      <join table="Account">
        <key column="AID" />
        <property name="LocationName" />
      </join>
    </subclass>    
  </class>

これを実行すると、正しいフィールドのセットを使用してテーブルが作成されます。問題は、レコードを挿入するときです。

私は以下のようにそれをします。

Bank bank = new Bank();
bank.Name = "Any Name";
bank.Serial = "0001";
bank.BranchName = "Local CIty";

using (ISession session = NHibernateHelper.OpenSession())
{
    using (ITransaction transaction = session.BeginTransaction())
    {
        session.Save(bank);
        transaction.Commit();
    }
}

以下は、NUnitによって生成されたエラーです。多分私は何か間違ったことをしている。誰かがこれについて私を助けてくれますか?

NHibernate.PropertyValueException : Error dehydrating property value for 
xxxx.xxxxx.Bank.Name
  ----> System.IndexOutOfRangeException : Parameter index is out of range.
4

2 に答える 2

1

<join> 節は継承とは関係ありません。<subclass> 要素で十分です。継承を処理するその他の方法については、http: //nhibernate.info/doc/nh/en/index.html#inheritanceに記載されています。

于 2012-11-14T10:30:38.647 に答える
1

Account.hbm.xml マッピング ファイルを cluase で変更しました。今、物事はうまくいきます。エラーなしでレコードをスムーズに挿入できるようになりました。

これが作業用マッピング ファイルです。

  <class name="Account">
    <id name="AID" type="Int32">
      <generator class="native" />
    </id>
    <!-- <discriminator column="Type" type="string" /> -->
    <property name="Name" />
    <property name="Serial" />
    <property name="Type" />

    <joined-subclass name="Human" table="Human">
      <key column="AID" />
      <property name="FirstName" />
      <property name="LastName" />
    </subclass>

    <joined-subclass name="Bank" table="Bank">
      <key column="AID" />
      <property name="LocationName" />
    </subclass>    
  </class>

私は、差別条項が役に立ち、使い古されているかもしれないと考えました。:)それがなくてもうまくいきます。

于 2012-11-14T12:38:27.593 に答える