В настоящее время у нас есть приложение, которое извлекает данные с сервера через веб-службу и заполняет DataSet. Затем пользователи API манипулируют им с помощью объектов, которые, в свою очередь, изменяют набор данных. Затем изменения сериализуются, сжимаются и отправляются обратно на сервер для обновления.
Однако я начал использовать NHibernate в проектах, и мне очень нравится отключенный характер объектов POCO. Проблема, с которой мы сталкиваемся сейчас, заключается в том, что наши объекты настолько привязаны к внутреннему DataSet, что их нельзя использовать во многих ситуациях, и в конечном итоге мы создаем повторяющиеся объекты POCO для передачи туда и обратно.
Batch.GetBatch() -> calls to web server and populates an internal dataset
Batch.SaveBatch() -> send changes to web server from dataset
Есть ли способ достичь аналогичной модели, которую мы используем, когда весь доступ к базе данных осуществляется через веб-службу, но с использованием NHibernate?
Изменить 1
У меня есть частичное решение, которое работает и сохраняется через веб-службу, но имеет две проблемы.
- Мне нужно сериализовать и отправить всю свою коллекцию, а не только измененные элементы
- Если я попытаюсь повторно заполнить коллекцию после возврата моих объектов, все ссылки, которые у меня были, будут потеряны.
Вот мой пример решения.
Клиентская сторона
public IList<Job> GetAll()
{
return coreWebService
.GetJobs()
.BinaryDeserialize<IList<Job>>();
}
public IList<Job> Save(IList<Job> Jobs)
{
return coreWebService
.Save(Jobs.BinarySerialize())
.BinaryDeserialize<IList<Job>>();
}
На стороне сервера
[WebMethod]
public byte[] GetJobs()
{
using (ISession session = NHibernateHelper.OpenSession())
{
return (from j in session.Linq<Job>()
select j).ToList().BinarySerialize();
}
}
[WebMethod]
public byte[] Save(byte[] JobBytes)
{
var Jobs = JobBytes.BinaryDeserialize<IList<Job>>();
using (ISession session = NHibernateHelper.OpenSession())
using (ITransaction transaction = session.BeginTransaction())
{
foreach (var job in Jobs)
{
session.SaveOrUpdate(job);
}
transaction.Commit();
}
return Jobs.BinarySerialize();
}
Как видите, я каждый раз отправляю на сервер всю коллекцию, а затем возвращаю ее целиком. Но я получаю замененную коллекцию вместо объединенной / обновленной коллекции. Не говоря уже о том, что пересылка всех данных туда и обратно кажется крайне неэффективной, если только часть их может быть изменена.
Изменить 2
Я видел в сети несколько ссылок на почти прозрачный постоянный механизм. Я не совсем уверен, сработают ли они, и большинство из них выглядят экспериментально.
- Службы данных ADO.NET w / NHibernate (Айенде)
- Службы данных ADO.NET с NHibernate (Wildermuth)
- Пользовательские бизнес-коллекции с отложенной загрузкой с NHibernate
- NHibernate и WCF - не идеальная пара
- Spring.NET, NHibernate, службы WCF и отложенная инициализация
- Как использовать NHibernate Lazy Initializing Proxies с веб-службами или WCF
Мне сложно найти замену модели DataSet, которую мы используем сегодня. Причина, по которой я хочу уйти от этой модели, заключается в том, что требуется много работы, чтобы привязать каждое свойство каждого класса к строке / ячейке набора данных. Кроме того, это также тесно связывает все мои занятия вместе.