HasManyToMany Fluent NHibernate Mapping Ошибка удаления - PullRequest
3 голосов
/ 28 февраля 2012

Я работал над отображением «многие ко многим» для объекта, который я назвал «Задачей».Задача может иметь много детей и много родителей.Между ними есть таблица соединений, в которой есть только два столбца FK: «ParentTaskId» и «ChildTaskId».Вот то, что я придумал до сих пор.

        // Many-to-Many Parents
        HasManyToMany<Task>(x => x.Parents)
            .Table("TaskDependency")
            .ParentKeyColumn("ParentTaskId")
            .ChildKeyColumn("ChildTaskId")
            .Inverse()
            .Not.LazyLoad()
            .Cascade.SaveUpdate();

        // Many-to-Many Children
        HasManyToMany<Task>(x => x.Children)
            .Table("TaskDependency")
            .ParentKeyColumn("ChildTaskId")
            .ChildKeyColumn("ParentTaskId")
            .Not.LazyLoad()
            .Cascade.SaveUpdate();

А вот пример кода, который поможет мне проиллюстрировать мой вопрос.Приведенный ниже код работает:

        _taskRepository.Save(_taskVendor);
        _taskRepository.Save(_taskClientVendor);
        _taskRepository.Save(_taskClient);

        _taskVendor.Children.Add(_taskClientVendor);
        _taskClientVendor.Children.Add(_taskClient);
        _taskRepository.Save(_taskVendor);
        _taskRepository.Save(_taskClientVendor);

        _taskRepository.Delete(_taskVendor);
        _taskRepository.Delete(_taskClientVendor);
        _taskRepository.Delete(_taskClient);

Но если я изменю порядок операторов удаления на:

        _taskRepository.Delete(_taskVendor);
        _taskRepository.Delete(_taskClient);
        _taskRepository.Delete(_taskClientVendor);

, я получу нарушение ограничения fk в моей таблице соединений ко многим и многим.Я думаю, что это связано с тем, как я настроил обратное в моем отображении.Это влияет на порядок, в котором выполняются запросы, чтобы избежать этой точной проблемы ограничения fk.Есть ли способ сопоставить это так, чтобы я мог удалить объекты на любой стороне, дочернем или родительском, не имея этого исключения?Я попробовал инверсию с обеих сторон моего отображения, но это просто привело к тому, что мои отношения многие ко многим не спаслись.> _ <</p>

Любая помощь будет принята с благодарностью.

1 Ответ

3 голосов
/ 28 февраля 2012

вы должны удалить их вручную

void Delete(Task task)
{
    foreach (var parent in task.Parents)
    {
        parent.Childs.Remove(task);
    }
    session.Delete(task);
}
...