2013-08-06 2 views
-1

Продолжив после моего первоначального WebAPI фильтрации и пейджинговая проекция дилеммыBreeze WebAPI Update Проекция

Breeze $filter projections нити

Я сейчас пытаюсь обновить бэкэнд базу данных с небольшим успехом.

Давать факт, что я:

public IQueryable<ConsigneDTO> Consignees(string refname) 
    { 
     IQueryable<ConsigneDTO> q = this.db.Consignes 
      .Where(x => x.Refname == refname) 
        .Select(f => new ConsigneDTO {Refname = f.Refname, Consignee = f.Consignee, Address1 = f.Address1, Address2 = f.Address2, Address3 = f.Address3}); 
     return q; 
    } 

Что самый простой способ поместить эти данные обратно из Breeze?

Я вижу, что мои измененные данные возвращаются в обоих переопределениях

protected override bool BeforeSaveEntity(EntityInfo entityInfo) 
    { 
    } 

    protected override Dictionary<Type, List<EntityInfo>> BeforeSaveEntities(Dictionary<Type, List<EntityInfo>> saveMap) 
    { 
    } 

Но не легкий путь, чтобы подтолкнуть их в основной контекст, который является службой WCF, вытекающие из Data.Services.Client.DataServiceContext.

Как я называю

Context.UpdateChanges(EntityInfo); 

или

Context.UpdateChanges(SaveMap); 

Особенно принимая во внимание EntityInfo и SaveMap содержит DTO?

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

Как объяснялось в предыдущем разделе, я могу многое изменить в этом проекте. Единственные проблемы, с которыми я столкнулся, - это базы данных на другом сервере и столбцы, которые не могут быть общедоступными, а мой единственный способ для таблиц - EF5.

Я решил аккуратно обернуть EF, используя OData-v3/WCF-Data-Services, и получить доступ к ним с моего контроллера бриза на веб-сервере.

До сих пор чтение \ запрос \ фильтрация и пейджинг отлично работают на SPA, но только с R «C_UD», я более чем готов переработать этот проект.

С наилучшими пожеланиями Майк

+0

Я собираюсь попытаться быть на одном уровне с вами. Вы говорите, что у вас есть служба WCF, с которой вы получаете данные, - что вы пытаетесь сделать здесь? Вы пытаетесь отправить данные обратно в метод GET? Надеюсь, что ... Если вы пытаетесь выполнить сохранение данных в службу WCF, у вас есть метод UPDATE или POST? Вы пытались перехватить сохранение и использовать эти методы? Если вы используете службу WCF и хотите, чтобы Breeze смог переопределить ваш метод GET с помощью POSTing данных, я чувствую, что вам нужно сделать немного больше исследований в службах WCF. Пожалуйста, поймите, что я не имею никакого отношения к команде Бриз ... –

+0

@PWKad Оцените усилия :) Я знаком с WCF (но всегда изучаю), и я могу использовать свой сервер данных с моего контроллера с помощью .Select() ; q.Address3 = "Foo"; Context.UpdateObject (кв); Context.SaveChanges; Моя проблема больше связана с Breeze. Breeze возвращает мне класс EntityInfo в BeforeSaveEntity или SaveMap и SaveBundle в других переопределениях. Ни один из них, похоже, не может перейти к UpdateObject(), и даже если бы мог, это DTO из-за проекции Select(), и я не думаю, что WCF будет знать, что с ним делать. Я собираюсь удалить проекцию в качестве теста и преодолеть барьер. – Mike

+0

Я обновил исходный вопрос, чтобы указать больше на Breeze Overrides и DTO - Спасибо снова – Mike

ответ

2

Вызов Breeze EntityManager.saveChanges предназначен для сохранения изменений объектов, которые ранее были запрошены. Этот процесс может быть автоматизирован Breeze, потому что он имеет метаданные в отношении этих типов сущностей и способен создавать соответствующий код на сервере для их сохранения. В вашем случае то, что вы возвращаете из своих запросов, не является «сущностями», и если вы не можете превратить их в сущности, Breeze не сможет их сохранить. Таким образом, у вас есть несколько подходов, которые вы можете попробовать.

Первый заключается в том, чтобы взять ваш DTO при извлечении на клиенте и динамически создавать из них «частичные» объекты, которые впоследствии могут быть полностью разрешены, если необходимо внести какие-либо изменения. См. Пример John Papa's Code Camper, чтобы увидеть пример этого. В качестве побочного примечания, если ваш DTO фактически включает объекты Breeze в проекции, тогда даже это необязательно.

Другой подход заключается в том, чтобы полностью обойти Бриз, пытаясь сохранить их. Просто используйте адаптер Breeze ajax напрямую и отправьте свои данные прямо на любую конечную точку, которую вы хотите. Очевидно, что в этом случае вам нужно будет написать весь код на стороне сервера, необходимый для сохранения опубликованных данных.

+0

Спасибо, Джей, я предполагаю, что они являются сущностями, но «объектами DTO», savemap выглядит хорошо, а entityInfo в BeforeSaveEntity показывает EntityState как измененный и отслеживание OriginalValuesMap для измененных свойств. Все выглядит полно, за исключением того, что оно возвращает его в исходную таблицу. Я использовал проекты CodeCamper и TempHire в качестве шаблона; Я думаю, что мое основное различие заключается в том, что моя проекция является серверной частью в контроллере, а не .js в клиенте. Мы не можем позволить Брезе проецировать на безопасность, поэтому мы прибегли к WebApi по истинной Odata. Цените любую другую помощь :) – Mike

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