2010-09-23 3 views
2

У меня очень простое приложение служб данных WCF, и я выполняю некоторые основные операции CRUD. У меня есть ChangeInterceptor в наборе сущностей, который меняется, но объект в ChangeInterceptor - это текущее состояние в базе данных, а не то, что отправлено в HTTP PUT. Есть ли способ проверить свойства объекта перед его сохранением?Могу ли я проверить объект перед сохранением изменений?

Вот мой ChangeInterceptor:

[ChangeInterceptor("People")] 
public void OnChangePerson(Person personChanging, UpdateOperations updateOperations) { 
    switch (updateOperations) { 
     case UpdateOperations.Change: 
      // personChanging is the database version here, not the changed version. 
      break; 
     default: 
      break; 
    } 
} 

Вот мой клиентский код (Jquery):

var data = { 
    FirstName: "NewFN", 
    LastName: "NewLN" 
}; 
$.ajax({ 
    type: "PUT", 
    url: serviceUrl + "/People(" + personID + ")", 
    contentType: "application/json", 
    dataType: "json", 
    data: JSON.stringify(data), 
    success: function (data) { 
     alert("Success!"); 
    }, 
    error: function (error) { 
     alert("An error occured"); 
    } 
}); 

Вот это JSON отправляется на сервер: alt text

Вот сообщение ChangeInterceptor, когда сообщение получено: alt text

Я загрузил код этого проекта здесь: http://andyjmay.com/test/2921612/ODataTest.zip

+0

+1 для включения источника. – jfar

ответ

1


Я загрузил ваш образец, усовершенствовал вашу проблему и смог увидеть последнее обновленное значение, используя эту рабочую среду.
Пока я исследую это внутренне, Можете ли вы изменить свой код, чтобы использовать глагол слияния вместо PUT?
С этим изменением вы должны теперь увидеть последние значения сущностей, передаваемые в ChangeInterceptors, когда вы обновляете значения через клиент jQuery.

$.ajax({
beforeSend: function (xhrObj) {
xhrObj.setRequestHeader("X-Http-Method", "MERGE");
},
type: "POST",
url: serviceUrl + "/People(" + personID + ")",
contentType: "application/json",
dataType: "json",
data: JSON.stringify(data),
success: function (data) {
GetAllPeople();
},
error: function (error) {
alert(error);
}
});

+0

Большое спасибо! Это проблема с службами данных WCF и EF, или это ожидаемое поведение?Я только начинаю использовать службы данных WCF, и, если это возможно, я бы хотел следовать лучшим методам. –

+0

Hi Andy, Это ошибка во время выполнения сервера служб данных WCF. Мы, кажется, передаем устаревшее значение во время выполнения пользователя и внутренне используем последние значения, отправленные клиентом. Если вы хотите также проверить значения для PUT, рассмотрите возможность переопределения метода SaveChanges объекта ObjectContext и выполнения вашей проверки. Ниже приведена документация MSDN для этого метода: http://msdn.microsoft.com/en-us/library/bb336792.aspx –

1

WCF получил некоторое хорошее расширение, которое вы можете написать, как MessageInspector и ParameterInspector. Я уверен, что один из них может помочь вам проверить материал до того, как сервер даже начнет работу с запросом.

0

Хм ... вы говорите, что personChanging - это версия базы данных, это определенно должна быть обновленная версия.

Мои тесты (и люди из группы продуктов) говорят мне, что это должна быть версия, которая приходила по проводам. Может ли что-то другое ошибиться?

Например, может ли ваша собственность быть Первым именем вместо FirstName?

+0

В соответствии с этим (msdn.microsoft.com/en-us/library/dd744842.aspx) вы правы, этот параметр должен быть отправлен. Однако это не так. Кроме того, имена свойств верны, и обновление работает, я просто не могу его проверить. Я загрузил свой тестовый проект здесь: http://andyjmay.com/test/2921612/ODataTest.zip –

1

Если услуга основана на EF и запрос PUT, тогда будет предоставлено старое значение (это связано с тем, как поставщик EF реализован и может быть ошибкой, мы рассмотрим это еще немного) , Вы можете обойти это, отправив вместо этого запрос MERGE. Я проверил, что в этом случае он работает так, как ожидалось (вы получаете новые значения). MERGE имеет немного различную семантику, но это может сработать для вас. PUT перезаписывает объект, поэтому, если вы не отправили значение для данного свойства, оно будет сброшено до значения по умолчанию. MERGE только модифицирует существующий объект со значениями из полезной нагрузки, поэтому, если какое-либо свойство не находится в полезной нагрузке, его значение останется нетронутым.

Смежные вопросы