C# Fluent NHibernate:许多自参考映射
我需要帮助为此类场景创建正确的fluent nh映射: 类别可以是一个或多个类别的子类别。因此,导致该实体:C# Fluent NHibernate:许多自参考映射,c#,.net,nhibernate,fluent-nhibernate,C#,.net,Nhibernate,Fluent Nhibernate,我需要帮助为此类场景创建正确的fluent nh映射: 类别可以是一个或多个类别的子类别。因此,导致该实体: public class Category : Entity, IAggregateRoot { [EntitySignature] public virtual string Name { get; set; } public virtual IList<Category> Parents { get; set; } public virtu
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);
}
}
}
它首先删除所有映射,然后插入剩余的映射。正确的方法是删除类别父映射,此类语句:
DELETE FROM CategoryParents WHERE CategoryId = @p0 AND ParentCategoryId = @p1;@p0 = 2, @p1=1
有什么想法吗?查看映射后,我认为您希望更改级联选项。这里有一篇文章概述了实体之间的父子关系。虽然它是从孤立实体的角度来看的,但我认为你会发现这个博客很有帮助。祝你好运
我注意到您正在使用IAggregateRoot。这难道不妨碍一个以上的父母吗?
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