将HasMany和ManyToMany关系公开为IEnumerable

时间:2011-04-21 20:18:18

标签: nhibernate fluent-nhibernate

目前在我的实体中,我将我的集合公开为IList,但我一直在考虑将它们公开为IEnumerable以防止用户手动添加到集合中。我为这些操作添加了特定的内容,以便确保我的双向关系保持不变。在这种情况下会想到几个问题。

  1. 如果我将它们公开为IEnumberable,这是否意味着我需要为代表我实体中的关系的每个集合添加一个Add和Remove方法?
  2. 有更简单的方法吗?我不反对这样做只是想知道。
  3. 你这样做吗?
  4. 示例:

    public class OrderHeader
    {
        public virtual Guid OrderId { get; private set; }
    
        public virtual IList<OrderLine> OrderLines { get; set; }
    
        public virtual void AddLine(OrderLine orderLine)
        {
            orderLine.Order = this;
            OrderLines.Add(orderLine);
        }
    
        //No need for a remove method since we expose collection as IList
    }
    

    转换上面的类以便我们只公开IEnumerable会导致:

    public class OrderHeader
    {
        public virtual Guid OrderId { get; private set; }
    
        private IList<OrderLine> orderLines { get; set; }
        public IEnumerable<OrderLine> OrderLines { get { return orderLines; } }
    
        public virtual void AddLine(OrderLine orderLine)
        {
            orderLine.Order = this;
            orderLines.Add(orderLine);
        }
    
        public virtual void RemoveLine(OrderLine orderLine)
        {
            orderLines.Remove(orderLine);
        }
    }
    

2 个答案:

答案 0 :(得分:2)

  1. 是的,如果您公开IEnumerable,最好在类上添加方法来处理添加/删除
  2. 私人支持领域是一个非常好的解决方案。
  3. 是的,但请记住,如果您想要真正只读访问公开的集合,请使用ReadOnlyCollection - http://msdn.microsoft.com/en-us/library/ms132474.aspx

答案 1 :(得分:2)

同意Dan的回答,稍作改动:

public IEnumerable<OrderLine> OrderLines
{ get { return orderLines.Select(x => x; } }