私はNHibernateのセットアップで数日間戦ってきましたが、私のマッピングを設定する方法は、私はそれが期待されるように動作するように。削除を許可するが、重複レコードを避けるためにNHibernateの多対多リレーションシップを定義する正しい方法は何ですか
私が問題になる前に、少しずつコードを書いています。余分な読書のために事前にお詫び申し上げます。
セットアップは、ちょうどこれらのテーブルで、現時点では非常に単純です:
カテゴリー
区分
名前
項目
アイテムID
名前
ItemCat
アイテムID
区分
egoryアイテムは多くのカテゴリにすることができ、各カテゴリは(簡単な多対多の関係)多くのアイテムを持つことができます。
私は私のマッピングのように定めている:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="..."
namespace="...">
<class name="Category" lazy="true">
<id name="CategoryId" unsaved-value="0">
<generator class="native" />
</id>
<property name="Name" />
<bag name="Items" table="ItemCategory" cascade="save-update" inverse="true" generic="true">
<key column="CategoryId"></key>
<many-to-many class="Item" column="ItemId"></many-to-many>
</bag>
</class>
</hibernate-mapping>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="..."
namespace="...">
<class name="Item" table="Item" lazy="true">
<id name="ItemId" unsaved-value="0">
<generator class="native" />
</id>
<property name="Name" />
<bag name="Categories" table="ItemCategory" cascade="save-update" generic="true">
<key column="ItemId"></key>
<many-to-many class="Category" column="CategoryId"></many-to-many>
</bag>
</class>
</hibernate-mapping>
項目に分類し、分類リスト内の項目のリストに項目を追加するための私の方法は、関係の両側を設定します。 カテゴリーで
public virtual IList<Category> Categories { get; protected set; }
public virtual void AddToCategory(Category category)
{
if (Categories == null)
Categories = new List<Category>();
if (!Categories.Contains(category))
{
Categories.Add(category);
category.AddItem(this);
}
}
:項目で
public virtual IList<Item> Items { get; protected set; }
public virtual void AddItem(Item item)
{
if (Items == null)
Items = new List<Item>();
if (!Items.Contains(item))
{
Items.Add(item);
item.AddToCategory(this);
}
}
今では邪魔だ、私がいる問題は、次のとおりです。
Categorから 'inverse = "true"を削除するとy.Itemsマッピングでは、検索ItemCategoryテーブルに重複したエントリがあります。
'inverse = "true"'を使用すると、NHibernateが一致するレコードをルックアップテーブルから削除しないため、カテゴリを削除しようとするとエラーが発生するため、外部キー制約のため失敗します。
バッグにcascade = "all"を設定した場合、エラーなしで削除できますが、カテゴリを削除するとそのカテゴリのすべてのアイテムも削除されます。
私はあなたが期待するように動作する多対多マッピングを可能にするために、私のマッピングを設定している途中でいくつかの基本的な問題はありますか?
「あなたが期待する」とは、削除されているアイテムとそれに対応するルックアップの値よりも何も削除しないということです(リレーションシップの反対側のアイテムは影響を受けません)。コレクションは、正確で重複しない値でルックアップテーブルを更新します。
ご意見をいただければ幸いです。
"inverse = 'true'"を逆にすると、カテゴリを期待どおりに削除できますが、これまでの問題とは逆の結果になります。アイテムを削除しようとするとエラーが発生しますルックアップ値を削除します。 –
私は主題についてさらに調査を行い、自分の調査結果を含めるために私の答えを編集しました。 – tolism7
更新していただきありがとうございました。これは大きな助けとなりました。遅い返事をお送りいただき、ありがとうございます。回答を更新したことをお知らせしてメールを受け取っていませんでした。 –