nhibernate много-много удаляет - PullRequest
3 голосов
/ 29 апреля 2010

У меня есть 2 класса, которые имеют отношения многие ко многим. Я хотел бы, чтобы всякий раз, когда я удалял одну сторону, удалялись ТОЛЬКО записи ассоциации, не заботясь о том, какую сторону я удаляю.

упрощенная модель:

классы:

class Qualification
{
     IList<ProfessionalListing> ProfessionalListings 
}

class ProfessionalListing
{
     IList<Qualification> Qualifications

     void AddQualification(Qualification qualification)
     {
        Qualifications.Add(qualification);
        qualification.ProfessionalListings.Add(this);
     } 
}

плавное автоматическое преобразование с переопределениями:

void Override(AutoMapping<Qualification> mapping)
{
     mapping.HasManyToMany(x => x.ProfessionalListings).Inverse();
}

void Override(AutoMapping<ProfessionalListing> mapping)
{
    mapping.HasManyToMany(x => x.Qualifications).Not.LazyLoad();
}

Я пробую различные комбинации каскадных и обратных настроек, но никогда не смогу их найти. Если у меня нет каскадов и нет инверсии, я получаю дублированные объекты в моих коллекциях. Установка инверсии на одной стороне устраняет дублирование, но когда я пытаюсь удалить квалификацию, я получаю «удаленный объект будет повторно сохранен каскадом».

Как мне это сделать?

Должен ли я отвечать за очистку ассоциаций каждого удаляемого объекта?

Ответы [ 2 ]

2 голосов
/ 04 июня 2010

Таблица «многие ко многим» фактически является постоянной формой списков (ProfessionalListings и Qualifications). Когда вы удаляете один из объектов, он все еще находится в списке другого, не так ли?

Вы не можете ожидать от NHibernate, что он обновит ваш список. Например, если вы удалите квалификацию в базе данных, она все еще будет в списке квалификаций, потому что вы ее там не удалили. NHibernate не (и не должен) обновлять ваш список.

ProfessionalListings - обратный список, это означает, что он только загружен, но не сохранен. Вам нужно хотя бы обновить список Qualifications при удалении квалификации. Это регулярная согласованность в вашей модели классов, которая управляется бизнес-логикой.

0 голосов
/ 29 апреля 2010

Если вам нужно удалить подключенный объект, вы можете настроить параметр каскада AllDeleteOrphan. Тогда, если вы удалите объект из ассоциации, он будет удален

...