NHibernate. Не могу добавить двух детей к родителю - PullRequest
0 голосов
/ 23 марта 2011

У меня общий сценарий родитель \ дети:

public class Order : AdvancedBaseOrder
{

    ICollection<ProducerRelation> producers = new List<ProducerRelation>();
    public virtual ICollection<ProducerRelation> Producers
    {
        get { return producers; }
        set { producers = value; }
    }
}

public class ProducerRelation : BaseProducerRelation
{
    public virtual Order Order { get; set; }
    public virtual int Number { get; set; }
}

Отображения:

Order.hbm.xml
....
<set name="Producers" cascade="all-delete-orphan" inverse="true">
  <key column="order_id"/>
  <one-to-many class="ProducerRelation,Avtobus66.Core"/>
</set>
....


ProducerRelation.hbm.xml
....
 <many-to-one name="Order" class="Order, Avtobus66.Core" column="order_id" cascade="none"/>
<property name="Number" >
  <column name="number"/>
</property>
....

Когда я запускаю этот код:

            Order order = (Order)session.Get(typeof(Order), 23);
            var a = new ProducerRelation();
            a.Number = 6;
            a.Order = order;

            var b = new ProducerRelation();
            b.Number = 7;
            b.Order = order;

            order.Producers.Add(a);
            order.Producers.Add(b);
            session.Merge(order);
            session.Flush();

добавлен только один из моих детей. Я знаю, что nhibernate «следит» за дочерней коллекцией за изменениями, но что я делаю не так? Почему nhib не может добавить двух детей?

SQL:

 NHibernate: SELECT ... WHERE this_.id = ?p0;?p0 = 23
 NHibernate: INSERT INTO gb_avtobus66.ekbprint_producer_relation (producer_price, producer_price_clean, order_id, ekbprint_product_id, client_id, number) VALUES (?p0, ?p1, ?p2, ?p3, ?p4, ?p5);?p0 = 0, ?p1 = 0, ?p2 = 23, ?p3 = NULL, ?p4 = NULL, ?p5 = 6
 NHibernate: SELECT LAST_INSERT_ID()

Ответы [ 2 ]

3 голосов
/ 23 марта 2011

Я подозреваю, что это из-за того, что вы используете set тип коллекции. Набор - это неупорядоченная коллекция, которая не содержит дубликатов. Скорее всего, он смотрит на двух новых детей и думает, что второй дубликат. Убедитесь, что вы переопределяете Equals / GetHashcode, чтобы указать, что является повторяющейся записью.

0 голосов
/ 23 марта 2011

Используйте get вместо Load ....:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...