Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как обновить коллецию на клиенте? RIA + EF 
:(
    Опции темы
dazy
Дата 2.6.2009, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 15.9.2006

Репутация: нет
Всего: 8



На клиенте загружаю данные с сервера, все проходит хорошо и гладко
Код

_context = new WordsDomainContext();
_context.LoadWords();


Но надо периодически обновлять данные. Если я делаю _context.LoadWords(); еще раз, то новые данные добавляются к старым. Т.е. происходит не рефреш а добавление. 
_context.Words = null; - так делать не позволяет: readonly.
Приходиться еще раз делать новый контекст, и загружать данные, то же самое что показано в коде выше. 

Есть какой нить способ грамотного обновления данных на клиенте? Чтобы текущие данные похерились, а новые загрузились?
PM MAIL   Вверх
Idsa
Дата 2.6.2009, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



dazy, прочитайте начало моей 5-й статьи по EF. Если не ошибаюсь, это именно то, что Вам нужно.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
dazy
Дата 2.6.2009, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 15.9.2006

Репутация: нет
Всего: 8



Статья хорошая, но я, наверное, не совсем ее понял. 
Попробовал поработать с MergeOption, но к сожалению результат тот же самый. Данные добавляются, не рефрешатся. 
Код

_context.LoadWords(null,MergeOption.OverwriteCurrentValues,null);


Тут надо сказать, что вопрос больше из области RIA а именно DomainContext нежели EF, как мне кажется. К примеру в статье используется System.Data.Services.Client.MergeOption на сколько я понял, у меня же на клиенте доступны только System.Windows.Ria.Data.MergeOption. Ну и они соответственно различны. 
PM MAIL   Вверх
Idsa
Дата 2.6.2009, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



dazy, нужно просто подключить сборку System.Data.Entity - тогда появится MergeOption из System.Data.Objects.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
dazy
Дата 2.6.2009, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 15.9.2006

Репутация: нет
Всего: 8



Не, не догоняю. 

Сборку эту я подключить могу, но она не принимается методом.

Вот дефолтный  лоадер
     
Код

   public void LoadWords()
        {
            this.LoadWords(null, MergeOption.KeepCurrentValues, null);
        }


А вот, что он в результате вызывает. 
Код

        public void LoadWords(IQueryable<Words> query, MergeOption mergeOption, object userState)
        {
            base.Load("GetWords", null, query, mergeOption, userState);
        }

Дело происходит на клиенте, может я не прав, но клиент же вообще про EF, как бы ни чего не знает, потому как на клиенте используются только вот такие сборки :
Код

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.ComponentModel.DataAnnotations;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.Web.Ria.Data;
    using System.Windows.Ria.Data;

PM MAIL   Вверх
Idsa
Дата 2.6.2009, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



LoadWords - это самописный метод?

Цитата(dazy @  2.6.2009,  21:30 Найти цитируемый пост)
потому как на клиенте используются только вот такие сборки :

Это не подключенные сборки, а подключенные пространства имен. Если сборки, реализующей EF-specific классы, на клиенте нет, ее просто нужно подключить, и ничего страшного в этом нет.

Это сообщение отредактировал(а) Idsa - 2.6.2009, 21:22


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
dazy
Дата 3.6.2009, 07:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 15.9.2006

Репутация: нет
Всего: 8



Цитата

LoadWords - это самописный метод?


Это часть прокси класса, который автоматически генерит студия на клиенте, для доступа к серверу, на основании DomainService который в свою очередь находится на сервере. Т.е. если даже что-то поменять в LoadWords, то студия его сгенерирует по новой перед компиляцией.
PM MAIL   Вверх
Idsa
Дата 3.6.2009, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



RIA значит... Понятия не имею, как эта технология работает. Она сама выполняет запросы к EF? Есть хотя бы теоретическая возможность подобраться к EF запросам и выполнять их с нужным MergeOption?
А что делает тот MergeOption, который принимает LoadWords? Если документации нет, можно в Reflector'е посмотреть.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
dazy
Дата 3.6.2009, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 15.9.2006

Репутация: нет
Всего: 8



Цитата

А что делает тот MergeOption, который принимает LoadWords? Если документации нет, можно в Reflector'е посмотреть. 

Да примерно тоже самое что и в EF. Есть OverwriteCurrentValues, KeepCurrentValues и KeepChanges.
И они похоже работают. Но у меня специфическая задача, я получаю несколько случайных значений из базы, а потом их надо заменить другими случайными значениями. Написано, что для рефреша, надо использовать KeepChanges. Но он именно для меня не подходит, потому что  он все же не обнуляет коллекцию.
Ну да ладно, это не сверх задача, в принципе можно для обнуления коллекции переопределять контекст. 
Код

            _context = new WordsDomainContext();
            _context.LoadWords();


А вообще RIA довольно интересная штука. Позволяет через http получать доступ к источнику данных. По сути тот же rest, но типизированный на клиенте. Очень просто. Создаешь на сервере DomainService, указываешь источник данных, и на клиенте, который должен быть в том же солюшене генерится прокси для доступа к этим данным. Соответсвенно те типы данных которые есть на сервере становятся доступными на клиенте. Тот же rest, только вся обработка запросов, их десереализация и т.п. делается силами RIA. Ну и там всякие прелести типа требований безопасности для доступа, или можно указать на сервере валидацию конкретного поля, и она же появится и на клиенте. Очень удобно когда сильверлайту нужно с базой данных работать. 
Тут обзор.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0484 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.