代码之家  ›  专栏  ›  技术社区  ›  frosty

实例化NHibernate集合

  •  2
  • frosty  · 技术社区  · 15 年前

    在我的订单实体中,我正在获取订单项的空引用。这在第一次创建订单时发生。我想增加一些

    order.OrderItems = new Iesi.Collections.Set<OrderItem>();
    

    此处的错误为“无法访问受保护的构造函数”set。

        public class Order
        {
            public virtual int Id { get; set; }
            public virtual ISet<OrderItem> OrderItems { get; set; }
    
            public virtual void AddOrderItem(OrderItem item)
            {
                item.Order = this;
                // OrderItems below is null
                OrderItems.Add(item); 
            }
    
        }
    
    
    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                       assembly="EStore.Domain"
                       namespace="EStore.Domain.Model">
    
      <class name="Order" table="Orders">
        <id name="Id" type="Int32" column="Id" unsaved-value="0">
          <generator class="identity"/>
        </id>
    
        <property name="UserName" column="UserName"/>
        <set name="OrderItems" table="OrderItems" generic="true" cascade="all-delete-orphan"  inverse="true" >
          <key column="OrderId" not-null="true" />
          <one-to-many class="EStore.Domain.Model.OrderItem, EStore.Domain" />
        </set>
    
      </class>
    </hibernate-mapping>
    
    2 回复  |  直到 15 年前
        1
  •  5
  •   Kenny Eliasson    15 年前

    将orderitems设置为构造函数中的新列表

    public Order() {
     OrderItems = new List<OrderItem>();
    }
    
        2
  •  3
  •   frosty    15 年前

    就像上面提到的那样。

    由于iesi.collections.set是一个抽象类,因此需要使用其中一个实现,如iesi.collections.hashedset、iesi.collections.hybridset、iesi.collections.listset或iesi.collections.sortedset。

    我已经更新了以下方法。关键部分是“new hashedset();”

     public virtual void AddOrderItem(OrderItem item)
        {
            item.Order = this;
            if (item.Order.OrderItems == null)
            {
                item.Order.OrderItems = new HashedSet<OrderItem>(); 
            }
            OrderItems.Add(item);
        }