Свободное владение NHibernate: Само-ссылающиеся сопоставления ManyToMany

2

Мне нужна помощь в создании правильного свободного отображения nh для такого сценария:

Категория может быть дочерним элементом одной или нескольких категорий. Таким образом, в результате этого объекта:

public class Category : Entity, IAggregateRoot
{
    [EntitySignature]
    public virtual string Name { get; set; }
    public virtual IList<Category> Parents { get; set; }
    public virtual IList<Category> Children { get; set; }
    public virtual IList<ProductCategory> Products { get; set; }

    public Category()
    {
        Parents = new List<Category>();
        Children = new List<Category>();
        Products = new List<ProductCategory>();

    }

    public virtual void AddCategoryAsParent(Category parent)
    {
        if (parent != this && !parent.Parents.Contains(this) && !Parents.Contains(parent))
        {
            Parents.Add(parent);
            parent.AddCategoryAsChild(this);
        }
    }

    public virtual void RemoveCategoryAsParent(Category parent)
    {
        if (Parents.Contains(parent))
        {
            Parents.Remove(parent);
            parent.RemoveCategoryAsChild(this);
        }
    }

    public virtual void AddCategoryAsChild(Category child)
    {
        if(child != this && !child.Children.Contains(this) && !Children.Contains(child))
        {
            Children.Add(child);
            child.AddCategoryAsParent(this);
        }
    }

    public virtual void RemoveCategoryAsChild(Category child)
    {
        if(Children.Contains(child))
        {
            Children.Remove(child);
            child.RemoveCategoryAsParent(this);
        }
    }
}

Мое первоначальное отображение:

public class CategoryMap : ClassMap<Category>
{
    public CategoryMap()
    {
        Id(p => p.Id).GeneratedBy.Identity();

        HasManyToMany(x => x.Parents)
            .Table("CategoryParents")
            .ParentKeyColumn("CategoryId")
            .ChildKeyColumn("ParentCategoryId")
            .Cascade.SaveUpdate()
            .LazyLoad()
            .AsBag();

        HasManyToMany(x => x.Children)
            .Table("CategoryParents")
            .ParentKeyColumn("ParentCategoryId")
            .ChildKeyColumn("CategoryId")
            .Cascade.SaveUpdate()
            .Inverse()
            .LazyLoad()
            .AsBag();
    }
}

Проблема с этим отображением заключается в том, что всякий раз, когда я удаляю категорию как родительскую или как дочернюю категорию другой категории, результирующий оператор SQL таков:

NHibernate: DELETE FROM CategoryParents WHERE CategoryId = @p0;@p0 = 2
NHibernate: INSERT INTO CategoryParents (CategoryId, ParentCategoryId) VALUES (@p0, @p1);@p0 = 2, @p1 = 3

Сначала он удаляет все сопоставление, а затем вставляет оставшееся отображение. Правильный способ - просто удалить родительское сопоставление категории, которое такое утверждение:

DELETE FROM CategoryParents WHERE CategoryId = @p0 AND ParentCategoryId = @p1;@p0 = 2, @p1=1

Любые идеи?

  • 1
    Я заметил, что вы используете IAggregateRoot. Разве это не противоречит наличию более одного родителя?
Теги:
nhibernate
fluent-nhibernate

1 ответ

0

после просмотра ваших сопоставлений, я думаю, что вы хотите изменить свои параметры Cascade. Вот статья, в которой описываются отношения между родителями и дочерними элементами. Хотя это происходит с точки зрения наличия сиротских сущностей, я думаю, что вы найдете блог полезным. Удачи...

http://ayende.com/Blog/archive/2006/12/02/nhibernatecascadesthedifferentbetweenallalldeleteorphansandsaveupdate.aspx

Ещё вопросы

Сообщество Overcoder
Наверх
Меню