2014-02-17 8 views
0

У меня есть объект Home, который я отправляю с сервера на своих клиентов.Навигационные свойства не обновляются Обновлено

public Home { 
    public HomeId {get;set;} 
    public String Address {get; set;} 
    public ICollection<Room> Rooms{ get; set;} 
} 

Управление данными на клиентской стороне осуществляется BreezeJs.

Мое веб-приложение многопользовательское. Всякий раз, когда пользователь обновляет объект Home, сервер уведомляет всех заинтересованных клиентов, используя SignalR. Когда клиент получает уведомление, он запускает следующий запрос, чтобы обновить свой кэш:

function refresh(homeId) { 
    var query = entityQuery.from('Homes') 
        .withParameters({ homeId: homeId }); 

    return manager.executeQuery(query) 
        .fail(queryfailed); 

    function queryfailed(data) { 
     // error 
    } 
} 

на стороне сервера управления:

[HttpGet] 
    public Home Homes(int homeId) 
    { 
     var home = _context.Context.Homes 
          .Include(t => t.Rooms) 
          .FirstOrDefault(t => t.HomeId == homeId); 
     return home; 
    } 

Проблема

Когда Home объект обновляется, все свойства получают новые значения с сервера, но не свойства навигации. Если пользователь добавляет/удаляет Room в/из данного House, тогда связанные Rooms объекты в кеше не обновляются, хотя данные json выглядят отлично и содержат добавленные/удаленные объекты Room.

Вопросы

Есть простой способ сказать Breeze обновить Home и все его навигационные свойства? В идеале я хотел бы сделать это, не очищая кеш, как описано here, чтобы избежать некоторых мерцаний в моем пользовательском интерфейсе.

Обновление Я

Я попытался расширяющийся мой запрос, чтобы включить Rooms по

var query = entityQuery.from('Homes') 
         .withParameters({ homeId: homeId }) 
         .expand("Rooms"); 

все тот же вопрос, данные в формате JSON содержит изменения, сделанные другими клиентами, но не отражается на местном лица

Update II

Мне удалось получить изменения для распространения на клиентов, используя expand. Однако изменения распространяются только при добавлении Rooms, но не при их удалении.

+0

Почему бы просто не использовать .expand() для свойств навигации, которые вы хотите обновить? Автоматическое обновление всех свойств навигации могло бы стать ДЕЙСТВИТЕЛЬНО беспорядочным, особенно на сложных графиках объектов. –

+0

Я попытался использовать расширение, но он не работал, свойство навигации не обновилось. – GETah

+0

Имели ли эти свойства навигации изменения, когда результаты возвращались? –

ответ

2

Просто чтобы прояснить, я думаю, что вы имеете дело с домом «добавляемых и удалены из одной комнаты„“одним клиентом, и эти обновления не правильно обновляемых на другом клиенте с тем же„дом“.

Если это так, причина заключается в том, что клиент бриза может определить, какие «комнаты» были добавлены в дом другим клиентом, но он не может определить, какие номера были перемещены или удалены, если вы также не требуете номера

Чтобы уточнить, предположим, что номер 1 перемещен из дома 1 в дом 2 клиентом A. Клиент B все еще имеет дом 1, содержащий комнату 1. Когда клиент B запрашивает дом 1 (с включенным), он вернется нет roo мс, но бриз НЕ удалит Room1 из дома 1, потому что он не знает, куда он переместился.Если вы должны были потребовать либо Room1, либо House 2 с «Номерами», то бриз будет иметь достаточную информацию, чтобы «переместить» комнату.

Таким образом, одним из подходов, которые вы могли бы следовать, было бы просто отсоединить «все» комнаты, связанные с конкретным домом, до «освежающего» дома. Вы бы «потеряли» любые дома, которые были перевезены в другой дом, но, вероятно, они будут освещены в этом доме.

Не знаете, насколько это понятно, но ...

+0

Вы догадываетесь, что я нацелен на то, чтобы получить клиенту изменения, распространяемые на других клиентов. Ваше предлагаемое решение хорошее, но не идеальное, поскольку я должен отделить некоторые «комнаты» до завершения запроса, это сделает мерцание пользовательского интерфейса после добавления новых комнат. – GETah

+0

Если вы обновите другой дом (который переместили в комнату) с помощью expand, это также приведет к правильному поведению, и вы не должны получать мерцание. –

+0

Согласен. Страница мерцает при удалении всех комнат, а затем добавляет вновь вывешенные комнаты из того же дома – GETah

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