2

コレクションを作成し、同時にそれにカテゴリを追加しようとすると、null参照を取得し続けます。何か忘れましたか?それとも私はそれをすべて間違っていますか?

private static void SamepleMethod(ICollectionRepository collectionRepo)
    {
        Collection collection = new Collection { CollectionName = "Collection" };

        Category category = new Category { Collection = collection, CategoryName = "Category" };

        category.SetCollection(collection);
        collection.AddCategory(category);

        collectionRepo.Save(collection);
    }

コレクション:

public class Collection
{
    public virtual int? Id { get; set; }
    public virtual string CollectionName { get; set; }
    public virtual ICollection<Category> Categories { get; set; }

    public virtual void AddCategory(Category category)
    {
        Categories.Add(category);
        category.Collection = this;
    }
}

カテゴリー:

public class Category
{
    public virtual int? Id { get; set; }
    public virtual string CategoryName { get; set; }
    public virtual Collection Collection { get; set; }

    public virtual void SetCollection(Collection collection)
    {
        Collection = collection;
        collection.Categories.Add(this);
    }
}

Collection.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
               namespace="ACME.Model"
               assembly="ACME.Model">

<class name="Collection" table="Collections" >

<id name="Id" column="CollectionId" type="int" >
  <generator class="identity" />
</id>

<set name="Categories" inverse="true" cascade="all">
  <key column="CollectionId" />
  <one-to-many class="Category"></one-to-many>
</set>

<property name="CollectionName">
  <column name="CollectionName" sql-type="nvarchar(50)" />
</property>

Category.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
               namespace="ACME.Model"
               assembly="ACME.Model">

<class name="Category" table="Categories" >

<id name="Id" column="CategoryId" type="int" >
  <generator class="identity" />
</id>

<many-to-one name="Collection"
             class="Collection"
             column="CollectionId"
             not-null="true" />

<property name="CategoryName">
  <column name="CategoryName" sql-type="nvarchar(50)" />
</property>

4

2 に答える 2

2

Categoriesクラスでプロパティを初期化したことがないCollectionため、デフォルト値のnullのままになります...
コンストラクターで新しいコレクションに初期化することをお勧めします。

また、カテゴリをコレクションに関連付ける少なくとも3つの異なるコード行を数えました。
私は一度で十分だと信じています:)(私はAddCategoryメソッドまたはのコンストラクターでそれが一番好きですCategory)。

もう1つの小さなこと-hbmマッピングファイルは過去のものです。最近では、コードでマップする方がはるかに便利です(エラーが発生しにくくなっています)。
古い拡張機能の流暢なnHibernateを使用するか、新しい公式のコードによるマッピングを使用してこれを行うことができます。これも非常に優れていますが、ドキュメントが不足しています。

于 2012-08-27T19:45:41.403 に答える
0

(sJhonnyが指摘しているように):Categoriesコレクションを初期化するようにしてください

それとは別に、私はあなたのコードに他の問題があります(あなたの問題とは関係ありません):

2つの参照(コレクションからカテゴリへ、またはその逆)を一度だけ初期化します。

あなたのコードは:

 // set category.Collection
 Category category = new Category { Collection = collection ...
 // set collection agin
 category.SetCollection(collection);
     // within SetCollection, you add the category
     collection.Categories.Add(this);
 // and add the category agin
 collection.AddCategory(category);

カテゴリは、複数のカテゴリを持つことができる複数のコレクションに配置できるようです。この場合は、それらをとしてマップする必要がありますmany-to-many。それが実際に正しい場合は、気にしないでください。

特別なことをしているのでない限り、sql-typeを使用しないでください。次のような文字列をマッピングするだけです。

<property name="CategoryName" column="CategoryName" length="50" />

IDの主キーは、パフォーマンスが低下するため、お勧めしません。

于 2012-08-27T20:03:27.363 に答える