Автоматически обновлять оба конца отношения один-ко-многим с помощью NHibernate - PullRequest
1 голос
/ 15 июля 2010

Это новый вопрос, заранее извините.

Я использую беглый NHibernate и получаю странное поведение на нем.

У меня есть два класса, которые выглядят так (упрощенно):

public class Group
{
    public virtual int Id{get;protected set;}
    public virtual String Name{get;set;}
    public virtual List<Person> Persons {get; protected set;}
}

public class Person
{
    public virtual int Id{get;protected set;}
    public virtual String Name{get;set}
    public virtual Group Group {get;set;}
}

и сопоставления Группа:

Id(x=>x.Id)
Map(x=>x.Name)
HasMany(x=>x.Persons).Cascade.All.Inverse()

лицо:

Id(x=>x.Id)
Map(x=>x.Name)
References(x=>x.Group)

Теперь в своем коде я хочу переместить имеющегося у меня человека в другую группу. Так как это отношения, я думал, что могу просто сделать

myPerson.Group = anotherGroup;
_mySession.SaveOrUpdate(myPerson);
_mySession.Flush()

Если я это сделаю, база данных будет обновлена ​​правильно, но если я попытаюсь посмотреть в списке лиц объекта "anotherGroup", я не увижу объект "myPerson", который все еще находится в лицах старой группы список.

Итак, есть ли способ сказать NH перезагрузить список или сделать так, чтобы он обновлялся всегда.

Единственный обходной путь, который я нашел сейчас, это:

myPerson.Group.Persons.Remove(myPerson);
anotherGroup.Persons.Add(myPerson);
myPerson.Group = anotherGroup;
_mySession.Flush()

Но я нахожу это немного грязным ...

Есть идеи, что я делаю не так? Спасибо!

Ответы [ 2 ]

3 голосов
/ 15 июля 2010

Используйте вспомогательные методы, чтобы упростить это; в группе вы хотите что-то вроде:

RemovePerson(person)
AddPerson(person)

Эта статья может оказаться полезной для получения дополнительных рекомендаций: Укрепление домена: инкапсулированные коллекции .

2 голосов
/ 16 июля 2010

@ Gimly отношения в L2S являются автоматическими, потому что он использует пользовательские коллекции (NHibernate работает со стандартными интерфейсами и может сохранять коллекцию после того, как вы создадите ее, например, List). Был, однако, некоторый неформальный разговор о том, как улучшить это, но ничего в багажнике нет, так как он имеет очень низкий приоритет, учитывая легкий обходной путь (ответ выше)

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