Walczyłem z konfiguracją NHibernate od kilku dni i po prostu nie mogę znaleźć prawidłowego sposób, aby ustawić moje mapowanie, aby działało tak, jak bym tego oczekiwał.Jaki jest poprawny sposób definiowania relacji wielu do wielu w NHibernate, aby umożliwić usuwanie, ale unikanie duplikatów rekordów
Zanim przejdę do problemów, muszę przejść trochę kodu, więc przepraszam z góry za dodatkowy odczyt.
Konfiguracja jest bardzo prosta w tej chwili, z tylko tych tabelach:
Kategoria
CategoryId
Nazwa
Przedmiot
ItemId
Nazwa
ItemCat egory
ItemId
CategoryId
Element może być w wielu kategoriach, a każda kategoria może mieć wiele elementów (proste wiele do wielu relacji).
Mam mapowanie określone jako:
<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>
moje metody dodawania elementów do listy pozycji w kategorii i listy kategorii w pozycję podaną obu stron relacji.
W Przedmiot:
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);
}
}
W Kategoria:
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);
}
}
teraz to na uboczu, kwestie Mam to:
Jeśli usunę "inverse =" true "z kategorii mapowanie y.Items, otrzymuję zduplikowane wpisy w tabeli LookKategorii kategorii.
Podczas używania "inverse =" true "", pojawia się błąd, gdy próbuję usunąć kategorię, ponieważ NHibernate nie usuwa pasującego rekordu z tabeli odnośników, więc nie działa z powodu ograniczenia klucza obcego.
Jeśli ustawię kaskadę = "wszystkie" na torebkach, mogę usunąć bezbłędnie, ale usunięcie kategorii spowoduje również usunięcie wszystkich pozycji w tej kategorii.
Czy jest jakiś podstawowy problem z tym, w jaki sposób skonfigurowałem swoje mapowanie, aby mapowanie wielu do wielu działało zgodnie z oczekiwaniami?
"Tak jak można się spodziewać", oznacza to, że usunięcie nie usunie niczego poza usunięciem elementu i odpowiednimi wartościami wyszukiwania (pozostawiając element na drugim końcu relacji bez zmian) i aktualizacjami do kolekcja zaktualizuje tabelę odnośników z poprawnymi i nie powielonymi wartościami.
Wszelkie sugestie będą bardzo cenne.
Jeśli odwrócę "inverse = 'true'" zgodnie z sugestią, mogę usunąć kategorie zgodnie z oczekiwaniami, ale wtedy mam odwrotność problemu, który miałem wcześniej: pojawia się błąd, gdy próbuję usunąć element, ponieważ nie usuń wartość wyszukiwania. –
Zrobiłem więcej badań na ten temat i zredagowałem moją odpowiedź, aby uwzględnić moje ustalenia. – tolism7
Dzięki za aktualizację - to była ogromna pomoc. Przepraszamy za spóźnioną odpowiedź. Nie dostałem wiadomości e-mail z informacją, że zaktualizowałeś swoją odpowiedź. –