удаление и создание новой дочерней коллекции в Nhibernate в том же сеансе - PullRequest
1 голос
/ 27 марта 2012

У меня есть требование удалить существующую коллекцию внутри родительского элемента и вставить новые записи коллекции.Это должно произойти в той же транзакции.Пожалуйста, проверьте ниже конфиг hbm.Пожалуйста, дайте мне знать, почему удаление не происходит с кодом ниже.

<class name="Category" table="Category" schema="dbo" lazy="true">
<id name="ID" access="property" column="Category_ID" unsaved-value="0">
  <generator class="native">
  </generator>
</id>

<property name ="CategoryName" access="property" column="Category_Name" not-null="true"/>
<bag name="Ratios" access="property"  table="Ratio" inverse="true" cascade="all"  lazy="true">
  <key column="CategoryID" />
  <one-to-many class="Category, Domain" />
</bag>

Код C #:

if (ratios!= null && ratios.Count > 0)
                            {
                                ratios= ratios.Where(a => a.ID == 0).ToList<Ratio>();
                                cat.Ratios = ratios;
                                if (cat.ID == 0)
                                {
                                    _repository.Save(cat);
                                }
                                else
                                {
                                    _repository.Update(cat);
                                }
                            }

Обратите внимание, что это происходит в рамках одной транзакции сеанса Nhibernate.Я только передаю новую коллекцию, используя ratios = ratios.Where (a => a.ID == 0) .ToList ();Таким образом, в коллекции нет уже сохраненных объектов в ссылке.

1 Ответ

1 голос
/ 27 марта 2012

Возможно, вам придется вручную очистить коллекцию и добавить все новые ratios обратно в коллекцию.Я уверен, что вы не можете просто установить коллекцию для новой ссылки, как вы делаете выше.Когда вы это делаете, NHibernate не может отслеживать изменения в коллекции.

Я не проверял нижеприведенное, но оно должно быть ближе к тому, что вам нужно:

cat.Ratios.Clear();
foreach(Ration ratio in ratios)
    cat.Ratios.Add(ratio);

Такжечто именно делают _repository.Save(cat) и _repository.Update(cat)?Если они вызывают ISession.Save и ISession.Update, в этом нет необходимости, поскольку в вашей коллекции «один ко многим» Ratios вы, вероятно, настроили каскадирование.Вы можете просто зафиксировать транзакцию, так как NHibernate отслеживает изменения в сущностях / коллекциях с помощью ISession

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