0

私は nHibernate を始めようとしている初心者で、とても苦労しています。次の例外(および内部例外)が発生しています

Common32.ExtractionCompany.ID の getter で例外が発生しました

オブジェクトがターゲット タイプと一致しません。

基本的に、始めたばかりなので、クラスの別のインスタンスがリストに格納されているはずのクラスがいくつかあります。A は C などを格納する B を格納します。キーとして GUID を使用しているため、Oracle 11g (私のデータベース) ではデータ型として Raw(16) を使用しています。奇妙なのは、これが部分的に機能することです。いくつかの B オブジェクトを A に入れれば、すべて問題ありません。CオブジェクトをBに入れようとすると、すべてが壊れます。

これがターゲットテーブルを作成するための私のSQLです。すべてのテーブルには、主キーとしての ID 列と、前のテーブルに戻る外部キーである列があります。

create table ExtractionCommand 
( ID Raw(16) );

create table ExtractionCompany
( ID Raw(16),
CommandID Raw(16) );

create table ExtractionTable
( ID Raw(16),
CompanyID Raw(16) );

create table ExtractionColumn
( ID Raw(16),
TableID Raw(16) );

create table ExtractionTarget
( ID Raw(16),
ColumnID Raw(16));

これが私のC#クラスです。

[Serializable]
public class ExtractionCommand
{
    public virtual Guid ID { get; set; }
    private IList<ExtractionCompany> m_company = new List<ExtractionCompany>();
    public virtual IList<ExtractionCompany> Company
    {
        get { return m_company; }
        set { m_company = value; }
    }
}

[Serializable]
public class ExtractionCompany
{
    public virtual Guid ID { get; set; }
    public virtual Guid CommandID { get; set; }
    private IList<ExtractionTable> m_tables = new List<ExtractionTable>();
    public virtual IList<ExtractionTable> Tables
    {
        get { return m_tables; }
        set { m_tables = value; }
    }
}

[Serializable]
public class ExtractionTable
{
    public virtual Guid ID { get; set; }
    public virtual Guid CompanyID { get; set; }
    private IList<ExtractionColumn> m_columns = new List<ExtractionColumn>();
    public virtual IList<ExtractionColumn> Columns
    {
        get { return m_columns; }
        set { m_columns = value; }
    }
}

[Serializable]
public class ExtractionColumn
{
    public virtual Guid ID { get; set; }
    public virtual Guid TableID { get; set; }
    public virtual ExtractionTarget Target { get; set; }
}

[Serializable]
public class ExtractionTarget
{
    public virtual Guid ID { get; set; }
    public virtual Guid ColumnID { get; set; }
    public virtual string TargetTable { get; set; }
    public virtual string TargetColumn { get; set; }
}

データベースに保存するための呼び出しを行う C# コードを次に示します (Oracle 11g)。

ExtractionCommand cmd = new ExtractionCommand();
cmd.ID = Guid.NewGuid();

ExtractionCompany c1 = new ExtractionCompany();                    
cmd.Company.Add(c1);

ExtractionTable t1 = new ExtractionTable();
c1.Tables.Add(t1);

session.Save(cmd);
transaction.Commit();

そして私のマッピング

<class name="ExtractionCommand" table="ExtractionCommand" >
<id name="ID">
  <generator class="guid" />
</id>    
<bag name="Company" cascade="all">
  <key column="CommandID" />
  <one-to-many class="ExtractionCompany"/>
</bag>
</class>

<class name="ExtractionCompany" table="ExtractionCompany" >
<id name="ID">
  <generator class="guid" />
</id>
<property name="CommandID"/>    
<bag name="Tables" cascade="all">
  <key column="CompanyID" />
  <one-to-many class="ExtractionCompany"/>
</bag>
</class>

<class name="ExtractionTable" table="ExtractionTable" >
<id name="ID">
  <generator class="guid" />
</id>
<property name="CompanyID"/>
<bag name="Columns" cascade="all">
  <key column="TableID"/>
  <one-to-many class="ExtractionColumn"/>
</bag>
</class>

<class name="ExtractionColumn" table="ExtractionColumn" >
<id name="ID">
  <generator class="guid" />
</id>
<property name="TableID" />
<one-to-one name="Target" class="ExtractionTarget"/>
</class>

<class name="ExtractionTarget" table="ExtractionTarget" >
<id name="ID">
  <generator class="guid" />
</id>
<property name="TargetTable"/>
<property name="TargetColumn"/>
</class>

どんな助けでも大歓迎です。ありがとうございました。mj

4

1 に答える 1

2

マッピングのone-to-many一部で間違ったタイプを使用しているため、壊れています。代わりExtractionCompanyに使用する必要があります:ExtractionTable

<class name="ExtractionCompany" table="ExtractionCompany" >
<id name="ID">
  <generator class="guid" />
</id>
<property name="CommandID"/>    
<bag name="Tables" cascade="all">
  <key column="CompanyID" />
  <one-to-many class="ExtractionTable"/>
</bag>
</class>

さらに:

クラスに親の ID を含めないでください。親への参照が本当に必要な場合は、親の型を持つプロパティを追加し、それを参照としてマップします。

于 2012-04-18T14:40:59.237 に答える