WCF DataService обновляет определенный столбец

У меня есть следующая таблица:

Имя

ID number(8) not null,
Field1 varchar2(50) not null,
Field2 varchar2(50) not null,
Field3 varchar2(50) not null

В этой таблице у меня есть следующие строки:

ID,Field1,Field2,Field3
12,'text1','text2','text3'

Теперь я хочу обновить только поле2 (с запросом ajax):

HTTP PUT http://host/DataService/SomeName(12M)
Accept: application/json, text/javascript, */*
Content-Type: application/json; charset=utf-8
{ Field2: 'updated field 2' }

Я ожидал, что это будет означать:

update sometable 
set field2 = 'updated field 2' 
where id = '12'

но это не так. Вместо этого я получаю сообщение об ошибке, в котором говорится, что поля field1 и field3 не могут быть нулевыми. Есть ли простой способ обойти это, чтобы обновлялись только столбцы, указанные в запросе? Должен ли я сначала выбрать затронутую строку, чтобы заполнить отсутствующие значения (чего я не хочу по соображениям производительности)? Я также не хочу хранить незатронутые столбцы в скрытых полях на стороне клиента, просто чтобы обновление заработало. Я использую EFOracleProvider с EF4.

Любые идеи?


person Jeldrik    schedule 29.07.2010    source источник


Ответы (1)


Вам нужно использовать MERGE вместо PUT. Семантика PUT "перезаписывает". Поэтому сначала он очищает все свойства до их значений по умолчанию (значение по умолчанию определяется провайдером). А затем он применяет свойства, которые вы отправили в запросе. Семантины MERGE — это «слияние». Он не очищает свойства, он просто применяет те, которые вы отправили в запросе.

person Vitek Karas MSFT    schedule 29.07.2010
comment
Большое тебе спасибо. Я не знал, что для выполнения таких операций был введен новый HTTP-глагол. - person Jeldrik; 29.07.2010
comment
К моменту разработки WCF Data Services не существовало стандартного HTTP-глагола для выполнения обновления слияния. Поэтому был использован новый MERGE. С тех пор был введен PATCH, и мы рассматриваем возможность добавления поддержки PATCH в следующем выпуске. Но их поведение очень похоже, это просто разные глаголы для одного и того же. - person Vitek Karas MSFT; 29.07.2010