处理NHibernate父子集合的最佳实践

Gar*_*eth 11 nhibernate domain-driven-design

因此,在一个典型的模型中,您的父母可以拥有许多孩子,而孩子只能拥有一个父母,那么如何管理孩子的添加.我一直在使用这种方法;

public class Parent
{
    public Parent()
    {
        Children = new List<Child>();
    }

    public IList<Child> Children
    {
        get;
        private set;
    }
}

public class Child
{
    public Parent Parent
    {
        get;
        set;
    }
}

var child = new Child();
var parent = new Parent();
parent.Children.Add(child);
child.Parent = parent;
Run Code Online (Sandbox Code Playgroud)

问题是,无论我想添加一个新的孩子,我都必须记住添加对孩子和父母的引用,这有点痛苦.我可以将AddChild方法添加到父类,并使其负责添加子项 - 现在的问题是有两种方法可以通过Children属性和方法添加子项.这是一个更好的解决方案吗?

public class Parent
{
    public Parent()
    {
        children = new List<Child>();
    }

    private IList<Child> children
    {
        get;
        private set;
    }

    public IEnumerable<Child> Children
    {
        get
        {
            return children;
        }
    }

    public void AddChild(Child child)
    {
        children.Add(child);
        child.Parent = this;
    }
}
Run Code Online (Sandbox Code Playgroud)

对此有最佳实践的指导,你做什么?

Ste*_*ger 10

这根本不是NHibernate的问题.

您应该实现AddChild方法.这些类负责它们的一致性,因此它们不应该暴露任何不可用的东西.例如,应隐藏(可变)子列表.公开IEnumerable是个好主意.

你的第二个代码是一个很好的起点.您可能需要更多方法,如RemoveChild或CoundChildren.


Fre*_*els 5

我是这样做的:

public class Parent
{
    private ISet<Child> _children = new HashedSet<Child>();

    public ReadOnlyCollection<Child> Children
    {
        get{ return new List(_children).AsReadOnly(); }
    }

    public void AddChild( Child c )
    {
       if( c != null && !_children.Contains (d) )
       {
          c.Parent = this;
          _children.Add (c);
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

所以,事实上,这也是Stefan所说的.我只是公开了Children列表的只读副本,这样您就可以轻松地遍历父项的子项,并获得父项的子项数.必须使用AddChild和RemoveChild成员方法完成向父项添加和删除子项.


epi*_*tka 2

我这样做,只是我不使用私有列表的属性

private IList<Child> _children
public IEnumerable<Child> Children
{
    get
    {
        return children;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的解决方案,但有一个缺点,如果消费者将 Children 转换为 IList&lt;Child&gt;,他将访问该列表并可以修改它。其他方法可以使用 ReadOnlyCollection&lt;&gt; (2认同)