2010-01-13 53 views
2

我需要在这种场景中创建正确流利的NH映射的帮助:功能NHibernate:多对多自引用映射

类别可以是一个或多个类别的孩子。因此,所得的此实体:

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 2010-03-05 05:12:31

回答