Могу ли я проверить сущность перед сохранением изменений? - PullRequest
2 голосов
/ 23 сентября 2010

У меня очень простое приложение служб данных 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

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

Ответы [ 4 ]

1 голос
/ 28 сентября 2010


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

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

1 голос
/ 27 сентября 2010

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

1 голос
/ 24 сентября 2010

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

0 голосов
/ 24 сентября 2010

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

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

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

...