То, что вы просите здесь, - это IMO Святой Грааль веб-сервисов и клиентских фреймворков.
Исправление в OData делает возможным и простым получение и обработку только измененных свойств объекта.
Однако клиент должен правильно построить пакет данных, что можно сделать одним из двух способов:
Перед отправкой клиент должен сравнить данные для отправки с данными, которые были получены последними, чтобы определить свойства, которые изменились.
Если данные на клиенте заключены в какую-либо модель представления, модель представления может отслеживать (или наблюдать) изменения, внесенные в свойства.
Затем при отправке клиентская сторона должна использовать эту информацию для построения дельты графа объекта.
Вы не включили какую-либо информацию о том, как вы генерируете свои URI для серверной службы, поэтому я не хочу гадать, но какой бы ни был механизм, необходимо будет реализовать 1 из двух вышеперечисленных стратегий.
Если ваша серверная часть представляет собой службу OData v4, вам может быть полезно начать с пакета OData Client. См. клиентскую библиотеку OData для .NET и следующие сведения о создании объекта на стороне клиента. графики: Генератор клиентского кода OData v4. Вы можете использовать это против любой службы, которая реализует спецификацию OData v4, а не только тогда, когда вы управляете кодом для серверной части.
Поддерживает несколько режимов пакетной обработки, так как пакетная обработка часто реализуется по-разному в реализациях OData v4. По этой причине я исключил пакетную обработку из этого обсуждения, но знаю, что она изначально поддерживается этими библиотеками и работает достаточно хорошо.
Пример использования сгенерированных классов см. в этом вопросе SO: Как правильно вызывать patch из клиента odata в web API 2 Или следуйте одному из моих модульных тестов:
[TestMethod]
public void TestPatch()
{
var client = ArcoCloud.Gateway.Client.Runtime.GetGatewayClient();
var changeTracker = new Microsoft.OData.Client.DataServiceCollection<ArcoCloud.Gateway.Client.ArcoCloud_DataModel.Device>(client.Devices);
// just change device 96
var device = changeTracker.Single(d => d.Id == 96);
device.Notes = "This is a test note to check if patch works natively";
client.SaveChanges();
/* Traced in Fiddler4
PATCH: {
"@odata.type": "#ArcoCloud_DataModel.Device",
"Notes": "This is a test note to check if patch works natively"
}*/
}
Обратите внимание, что для того, чтобы заставить клиента отправлять только измененные свойства, используется коллекция Microsoft.OData.Client.DataServiceCollection, которая наследуется от ObservableCollection, но имеет дополнительные преимущества, заключающиеся в сохранении внутреннего отслеживания изменений объектов в своем запросе. см. Класс DataServiceCollection.
Если вы используете клиентскую библиотеку OData и сгенерированные классы, вы можете легко запросить службу данных без DataServiceCollection, но если вы это сделаете, обновления поместят весь граф объекта. Вы также обнаружите, что синтаксис для сохранения изменений довольно многословен и сложен в использовании. Это предусмотрено дизайном, для обратной записи следует использовать DataServiceCollection. Платформа предлагает простой механизм запросов, чтобы вы могли упростить процессы в своих приложениях. Данные запроса/просмотра/фильтрации могут быть изолированы от кода, который окно редактирования данных может использовать для загрузки и сохранения своих данных.
Это официальный способ взаимодействия MS со службами OData v4 из кода C#. Прелесть шаблонов T4 заключается в том, что вы можете настроить шаблон там, где это необходимо, или расширить сгенерированные частичные классы, чтобы ваша бизнес-логика не переопределялась при повторном создании классов.
Вы можете создать свой собственный механизм для поддержки этого, если хотите, просто запомните два варианта: либо отслеживать изменения по мере их возникновения, либо использовать сравнение перед сохранением, чтобы определить, какие поля были изменены.
person
Chris Schaller
schedule
24.03.2017