2

したがって、多対多の関係を介して接続された 2 つのテーブル (Product と Supplier) があります。それらは次のようにコード化されています。

class Product
{
    public virtual uint id { get; set; }
    public virtual string name { get; set; }
    public virtual float stock { get; set; }
    public virtual float value { get; set; }
    public virtual Category category { get; set; }

    public virtual ISet suppliers { get; set; }
    public virtual ISet saleItems { get; set; }
    public virtual ISet stockInlets { get; set; }
}

-

class Supplier
{
    public virtual uint id { get; set; }
    public virtual string name { get; set; }
    public virtual string CNPJ { get; set; }
    public virtual string addressLine1 { get; set; }
    public virtual string addressLine2 { get; set; }
    public virtual string telephone1 { get; set; }
    public virtual string telephone2 { get; set; }

    public virtual ISet products { get; set; }
    public virtual ISet stockInlets { get; set; }
}

そして、これが私が彼らの関係をマッピングした方法です:

<set name="suppliers" table="product_x_supplier" fetch="join" lazy="false">
  <key column="product_id" />
  <many-to-many class="Supplier" column="supplier_id" />
</set>

-

<set name="products" table="product_x_supplier" fetch="join" lazy="false">
  <key column="supplier_id" />
  <many-to-many class="Product" column="product_id" />
</set>

現在、新しい製品を挿入して対応するサプライヤーをそれにリンクしようとすると問題が発生します。既存のものを更新することはできましたが、新しいものを作成することはできませんでした。使用しようとしている(簡略化された)コードは次のとおりです。

Product p = new Product()
{
    name = "Test product",
    stock = 0,
    value = 2,
    category = (Category)cats[0]
};

for (int i = 0; i < suppliers.Length; i++)
{
    p.suppliers.Add(suppliers[i]);
}

repository.Add(p);

それは教えてくれObject reference not set to an instance of an object.ます。オブジェクトをインスタンス化しようとしましたが、次のようにしp.suppliers = new IList<Supplier>();ましたが、それは不平を言いましたCannot create an instance of the abstract class or interface 'System.Collections.Generic.IList<TCC.Hibernate.Domain.Classes.Supplier>'

どんな助けでも大歓迎です。

4

2 に答える 2

3

使用する...

p.suppliers = new List<Supplier>();

リストにアイテムを追加する前に、リストを初期化する必要があります。はクラスではなくインターフェースです。のデフォルトの実装でIListある を使用する必要があります。ListIList

余談ですが、あなたは C# 言語や組み込みの .NET ライブラリにあまり慣れていないようです。Hibernate などのサードパーティ ライブラリを使用する前に、基本的な C# 開発に慣れることをお勧めします。Hibernate は非常に複雑なライブラリであり、このような単純なエラーでさえ診断に問題がある場合、多くの頭痛の種となります。

幸運を!

アップデート:

申し訳ありませんが、フィールド タイプがISetではなくであることに気付きませんでしIListた。Slyが回答で示したように、またはのISetような実装を使用する必要があります。HashSetSortedSet

これらのコレクション タイプの詳細については、MSDN を参照してください。

http://msdn.microsoft.com/en-us/library/0sbxh9x2

于 2012-09-10T22:48:51.037 に答える
2

使用する

 class Supplier
 {
      public Supplier()
      {
          this.suppliers = new HashedSet<Supplier>();
      }

      public virtual ICollection<Product> products { get; private set; }
 }

このようにして、コレクションが常に初期化され、誰もそれを置き換えることができないようにします。

于 2012-09-11T07:11:16.103 に答える