В nhibernate не может обновить список дочерних объектов - PullRequest
6 голосов
/ 10 декабря 2010

у меня есть x , который является объектом типа objectX , который имеет свойство ListOfObjectYs , что

List<objectY>

выглядит как отображение nhibernateкак это:

    public ObjectXMap()
    {
        HasMany(x => x.ListOfObjectYs).AsBag().Inverse(); 
    }

когда я иду сохранить его, я изменяю некоторые свойства на objectX и затем получаю:

    Session.SaveOrUpdate(x);

теперь мне нужно обновить этосвойство, которое является списком.Я получаю новый список объектов Y и хочу заменить существующий список объектов Y новым списком.мне нужно сделать это?

  foreach (ObjectY y in x.ListOfObjectYs)
                {
                   Session.Delete(y);
                    deleted = true;
                }
                if (deleted)
                {
                   _session.Flush();
                }
                x.ListOfObjectYs.Clear();

                foreach (ObjectY y in newObjectYList)
                {
                    x.ListOfObjectYs.Add(y);
                   Session.SaveOrUpdate(y);
                }
                _session.Flush();

мои вопросы:

  1. Нужно ли удалять все и очищать перед добавлением новых.
  2. Нужно ли мненужно сделать все эти инкрементные сохранения в промежутке между

. Есть ли лучший способ сделать это обновление, где мне нужно обновить объект (свойства), но также обновить свойства, которые являются списком, где есть целоеновый список (это означает, что элементы должны быть удалены и добавлены).

Ответы [ 2 ]

4 голосов
/ 10 декабря 2010

Ответов на ваши вопросы нет и нет.Если вы хотите заменить список, вы должны очистить его и добавить новые элементы.Если для каскада установлено значение all-delete-orphan, как в ответе Джеймса Ковача, то изменения в коллекции будут сохраняться при сбросе сеанса.

Важно понимать, что такое Save, Update иSaveOrUpdate означает в NHibernate:

  • Сохранить - сделать новый объект постоянным
  • Обновить - сделать измененный отдельный объект постоянным
  • SaveOrUpdate - сохранить или обновить в зависимости от несохраненного-значение идентификатора объекта

См. также Управление постоянными данными .

Если предположить, что все ваши объекты были загружены в одном сеансе, тогда замена коллекции может бытьтак же просто, как:

x.ListOfObjectYs.Clear();
foreach (ObjectY y in newObjectYList)
{
    x.ListOfObjectYs.Add(y);
}
_session.Flush();
3 голосов
/ 10 декабря 2010

Вам нужен каскад на вашем HasMany (). Если дочерние объекты полностью принадлежат родителю, хорошим выбором будет Cascade.AllDeleteOrphan (). Этот способ сохранения, обновления и удаления на родительском объекте автоматически распространяется на дочерние объекты, что устраняет необходимость в сложном блоке foreach. После этого просто обновите свою коллекцию и совершите транзакцию. NHibernate позаботится обо всем остальном.

ОБНОВЛЕНИЕ: Чтобы изменить список, просто добавляйте и удаляйте элементы из списка, как это обычно делается в коллекции .NET. Например:

public void RemoveY(ObjectY someY) {
    ListOfObjectYs.Remove(someY);
}

public void AddY(ObjectY someY) {
    ListOfObjectYs.Add(someY);
}

public void ClearAllY() {
    ListOfObjectYs.Clear();
}

Когда транзакция зафиксирована, любые изменения в коллекции ListOfObjectYs будут сохранены вместе с родительским ObjectX.

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