2

NHibernateは初めてです。NHibernateの学習を始めたばかりです。

C#コードで実行時エラーが発生します

NHibernate.PropertyAccessExceptionは処理されませんでした

 Message=Invalid Cast (check your mapping for property type mismatches); setter of NHibernateDemo.Customer
 InnerException: System.InvalidCastException
     Message=Unable to cast object of type 'NHibernate.Collection.Generic.PersistentGenericSet`1[NHibernateDemo.Order]' to type 'System.Collections.Generic.ISet`1[NHibernateDemo.Order]'.

以下は、のために書かれた私のC#コードです

public class Customer {
    public Customer()
    {
        MemberSince = DateTime.UtcNow;
        Orders = new HashSet<Order>();
    }

    public virtual Guid Id { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }

    public virtual Location Address { get; set; }

    public virtual ISet<Order> Orders { get; set; } 
}

hbmファイルは以下の通りです

<class name="Customer" table="Customer" lazy="true" >
    <id name="Id">
        <generator class="guid.comb" />
    </id>
    <property name="FirstName" />
    <property name="LastName" />

    <component name="Address" >
      <property name="Street" />
      <property name="City" />
      <property name="State" />
      <property name="Country" />
    </component>

    <set name="Orders" table="`Order`" order-by="Ordered desc">
        <key column="CustomerId" />
        <one-to-many class="Order" />
    </set>
</class>

public class Order {
    public virtual Guid Id { get; set; }
    public virtual DateTime Ordered { get; set; }
    public virtual DateTime Shipped { get; set; }
    public virtual Location ShipAddress { get; set; }

    public virtual Customer Customer { get; set; }
}


<class name="Order" table="`Order`">
    <id name="Id">
        <generator class="guid.comb" />
    </id>
    <property name="Ordered" />
    <property name="Shipped" />

    <component name="ShipAddress" >
        <property name="Street" />
        <property name="City" />
        <property name="State" />
        <property name="Country" />
    </component>

    <many-to-one name="Customer" column="CustomerId" />

</class>

Customer HBMファイルの「set」セクションを「list」に変更し、Customerクラスで必要な変更を行った場合。プログラムは正しく実行されています。また、CustomerHBMファイルから「set」セクションを削除した場合。それは働いています。

カスタマーHBMファイルの「set」セクションの何が問題になっているのかを見つけるのを手伝ってもらえますか?

4

1 に答える 1

2

マッピングはほぼ正しいですが、ISetインターフェースはシステム名前空間からではなくiesiライブラリ(NHibernateで配布)からのものであるiesiため、マッピングを参照および変更できます。

public virtual Iesi.Collections.Generic.ISet<Order> Orders { get; set; }

または、IList<>

とマッピングbag

<bag name="Orders" table="`Order`" order-by="Ordered desc">
  <key column="CustomerId" />
  <one-to-many class="Order" />
</bag>

注:エンティティが新しい演算子を介して作成され、NHibernateによってロードされない場合に備えて、リストを初期化することも忘れないでください

于 2012-11-20T07:38:05.253 に答える