CreateDbCommandDefinition запускается дважды во время метода PUT через службы данных WCF - PullRequest
0 голосов
/ 17 мая 2011

Мы пытаемся разработать нашего собственного поставщика EF для наших устаревших API. Нам удалось заставить операцию «GET / POST» работать успешно.

Однако для операции «PUT / MERGE» метод «CreateDbCommandDefinition» (из реализации DbProviderServices) запускается дважды. Один с "DbQueryCommandTree", а другой с "DbUpdateCommandTree".

Я понимаю, что необходимо обновить объект до его обновления (я думаю, для отслеживания изменений). В нашем случае мне не нужно извлекать информацию об объектах до обновления. Я просто хочу вызвать наши устаревшие API с объектом, отправленным на обновление. Как мы можем строго просить его не выполнять работу «DbQueryCommandTree» (и выполнять только работу «DbUpdateCommandTree»), когда я работаю с операциями «PUT / MERGE».

Код клиента выглядит примерно так, как показано ниже:

public void CustomerUpdateTest()
{
    try
    {
        Ctxt.MergeOption = MergeOption.NoTracking;
        var oNewCus = new Customer()
        {
            MasterCustomerId = "1001",
            SubCustomerId = "0",
            FirstName = "abc",
            LastName = "123"
        };
        Ctxt.AttachTo("Customers", oNewCus);
        Ctxt.UpdateObject(oNewCus);
        //Ctxt.SaveChanges();
        Ctxt.SaveChanges(SaveChangesOptions.ReplaceOnUpdate);
    }
    catch (Exception ex)
    {
        Assert.Fail(ex.Message);
    }

1 Ответ

0 голосов
/ 25 мая 2011

Вам нужно написать свой собственный IDataServiceUpdateProvider, чтобы это произошло. Для EF встроенный поставщик обновлений EF выполняет 2 запроса - один для получения объекта, который необходимо изменить, и один для фактического изменения. Мы планируем сделать этого провайдера общедоступным в нашем следующем выпуске, чтобы люди могли извлечь из него информацию и просто переопределить один или несколько методов. Но сейчас вам придется реализовать интерфейс самостоятельно.

Для запросов PUT / MERGE службы данных WCF вызывают IDataServiceUpdateProvider.GetResource, чтобы получить сущность для обновления. В вашей реализации этого метода вы можете вернуть токен, который представляет объект, который необходимо изменить (вам нужно будет посетить дерево выражений, которое передается в этом методе, чтобы узнать набор сущностей и значение ключа сущности вопрос).

В SaveChanges вы можете отправить обновление на основе токена. Таким образом, вы можете избежать одной поездки в базу данных.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...