Пояснение:
Скажем, у меня есть объектный граф, который вложен в несколько уровней, и каждая сущность имеет двунаправленную связь друг с другом.
A -> B -> C -> D -> E
Или, другими словами, A
имеет коллекцию B
, а B
имеет ссылку обратно на A
, а B
имеет коллекцию C
, а C
имеет ссылку назад B
и т. д.
Теперь допустим, что я хочу отредактировать некоторые данные для экземпляра C
. В Winforms я бы использовал что-то вроде этого:
var instanceOfC;
using (var session = SessionFactory.OpenSession())
{
// get the instance of C with Id = 3
instanceOfC = session.Linq<C>().Where(x => x.Id == 3);
}
SendToUIAndLetUserUpdateData(instanceOfC);
using (var session = SessionFactory.OpenSession())
{
// re-attach the detached entity and update it
session.Update(instanceOfC);
}
Говоря простым языком, мы извлекаем постоянный экземпляр из базы данных, отсоединяем его, передаем его на уровень пользовательского интерфейса для редактирования, затем повторно присоединяем и сохраняем обратно в базу данных.
Проблема:
Это прекрасно работает для приложений Winform, потому что мы все время используем одну и ту же сущность, с той лишь разницей, что она переходит от постоянной к отключенной к постоянной.
Проблема в том, что теперь я использую веб-сервис и браузер, отправляя данные JSON. Объект сериализуется в строку и десериализуется в новый объект. Это уже не отдельная сущность, а скорее временная сущность, у которой просто тот же ID, что и у постоянной (и обновленных полей). Если я использую эту сущность для обновления, она уничтожит отношения с B
и D
, потому что они не существуют в этой новой переходной сущности.
Вопрос:
У меня вопрос: как я могу сериализовать отдельные объекты через Интернет для клиента, получить их обратно и сохранить, сохраняя при этом любые отношения, которые я не изменил явно? Я знаю о ISession.SaveOrUpdateCopy
и ISession.Merge()
(они, кажется, делают то же самое?), Но это все равно уничтожит отношения, если я не установлю их явно. Я мог бы копировать поля из временного объекта в постоянный объект по одному, но это не слишком хорошо работает, когда дело касается отношений, и мне придется обрабатывать сравнения версий вручную.