2010-01-13 4 views
2

Мне нужна помощь в создании правильного отображения свободно Nh для такого рода сценарий:Fluent NHibernate: ManyToMany автореферентного отображения

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

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. Разве это не против того, чтобы иметь больше одного родителя? – Nathan

ответ

0

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

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