2015-03-02 2 views
2

У меня есть сценарий, где я знаю первичный ключ объекта (полученный из несвязанного источника), и я хочу обновить только 1 свойство (db). Я еще не получил объект из базы данных. Если возможно, мне бы не пришлось делать эту дополнительную поездку туда и обратно.Использование breeze.js Я только хочу отправить обновленные свойства для не кэшированного объекта

Я создаю объект, используя manager.createEntity. Я обновляю одно из свойств. Затем установите для параметра entityApect значение setModified(); При сохранении изменений все свойства, которые не были обновлены, устанавливаются в значения по умолчанию, а сгенерированная инструкция SQL UPDATE пытается обновить все сопоставленные столбцы.

Есть ли способ рассказать ветерок только генерировать SQL для конкретных свойств/столбцов?

благодаря

+0

Breeze (на клиенте) не генерирует SQL; это делается на сервере. Какие серверные технологии вы используете? –

+0

.net Web API и EF6 с SQL Server – mwill

+0

Я выяснил решение, но хотел бы знать, поддерживается ли if. Я знаю, что SQL генерируется в EF, но EF нужно сказать, что сгенерировать, откуда приходит бриз. Глядя на JSON, кажется, что если свойство было в исходном файлеValuesMap, оно будет включено в SQL обновить. Если бы не было карты, тогда весь объект был бы обновлен. Поэтому в моем примере выше, после выполнения всех шагов, я также установил исходное значение: obj.entityAspect.originalValues.myProperty = 0; (myProperty является числовым). Это правильно обновило только эту колонку. – mwill

ответ

3

Как вы обнаружили, свойства originalValuesMap путеводитель Ветерок сервера ContextProvider, как он готовит запрос сохранения. Это задокументировано в ContextProvider topic.

В вашем примере вы вызываете setModified после того, как вы изменили свойство. Все, что делает, это изменение EntityState; он не создает запись в объекте клиента entityAspect.originalValuesMap ... поэтому originalValuesMap, отправленный на сервер, пуст.

Я немного удивлен, что EFContextProvider.SaveChanges подготовил EF-обновление всей сущности. Я бы предположил, что он просто игнорировал сущность все вместе. Я делаю мысленное замечание, чтобы исследовать это сам. Не сказать, что поведение «правильно» или «неправильно».

Вам не нужно манипулировать originalValuesMap для достижения вашей цели. Просто измените последовательность. Попробуйте следующее:

var foo = manager.createEntity('Foo', { 
     id = targetId 
    }, breeze.EntityState.Unchanged); // create as if freshly queried 

foo.bar = 'new value'; // also sets 'originalValues' and changes the EntityState 

manager.saveChanges(); // etc. 

Сообщите нам, если это трюк.

+0

мой плохой, я должен это знать уже сейчас. Это сработало отлично. Ключ заключался в том, что он должен находиться в состоянии без изменений до того, как будут сделаны какие-либо обновления для объекта. Я создавал его в добавленном состоянии, а затем менял настройку, что просто неправильно. Вероятно, это путало бэкэнд EF с состоянием Modifed и отсутствием карты OV, вроде как комбинация добавления и обновления. Еще раз спасибо! – mwill

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