Search
Write a publication
Pull to refresh

ADO.Net Data Services. Диагноз — несъедобно.

Хочу расказать хабрасообществу об опыте знакомства з ADO.Net Data Services aka Astoria, и, по если кому-то понравится — получить приглашение.

Сейчас пишу маленький проект с использованием Microsoft'овського O/RM ADO.Net Entity Framework. Если не обращать внимания на некоторые врожденные болячки, с кторыми я уже научился боротся, результаты целиком удовлетворительные. Мое приложение являет собой типичный распределенный клиент(WPF)/сервер(WCF): данные жывут на сервере, клиент дергает его за каждый байт инфы. Так же данные и обновляються. На прошлой неделе я целиком случайно увидел відео, посвященные ADO.Net Data Services, также известной как Astoria, и просто офигел.
Видео можна посмотреть здесь, а на палцах — это сервис, который представляет клиенту в полное распоряжение Entity Framework'овскую модель. Ну тоесть при експорте сервиса на клиенте создается полная реплика модели, включая контекст, из которого можна брати объекты, менять, комитить — все так, будто-бы я работал с моделлю не через сервис, а локально.
Конечно, мене это очень искусило. В моделе WCF/WPF мне для каждого запроса приходилось создавать на сервере метод, протаскивать его через прокси… А тут все можна делать прямо на клиенте. Минимум на треть меньше кода, да і код стает елегантнее.
Итак, сегодня я угробив пол дня на то, чтобы попробовать перевести приложение на Astorию.
Результат получился негативным, но давайте по очереди.

Суть рефакторинга: функции из сервиса были винлайнены в клиент, причом происходила подмена контекстов.

Грабли №раз. Метод Include, который определяет, какие связанные данные нам нужно подтягивать вместе с объектом, отсутсвует. Первая мысль — круто, они подтягиваються on demand! Все методы Include ушли.
Легкая обработка напильником, и клиент скомпилился. Ура! Я даже не думав, что будет так легко.

Запускаю проект, и тут же вылет (грабли №два). Single(predicate) not supported. Черт! Ладно… Пробуем First(). То самое… Грр! Where(predicate).Single(). Как и ожыдалось — пошло.
Итак, со скрипом, но завелись. Хм. А где мои данные???
А нету у меня даних. Колекции зависимых данных — пустые.

Грабли №3. Прорвемся… Смотрим список методов в EntitySetа… Есть Expand! Ха… Тот самый Include, тільки синтаксис через слеш вместо через точку… Возвращаю на место старые Includы, тольки тепер уже как Expandы. Заводжу — есть контакт, правда с второй попытки — слешы были не в ту сторону.
Менше з ним. С выгребанием данных более-менее разобрались. Тепер что нам скажет апдейт?
Апдейт каже «An error occurred while processing this request.»
А что у нас в иннер ексепшине? Нету такого поля на сервере… Глупое! Ясно что нету… Я его в паршиал класе на клиенте доклеил!
Ладно… извращаемся, паршиал класи переписываем в врапперы. Запускаем… Апдейт.
«An error occurred while processing this request.»
Иннер? Тоже саме. Вообще класно. И как я узнаю, что случилось???? На этой мажорной ноте я послав Асторию под три чорта, хотя это была не единствення причина.

Еще двума существенными аргументами были проблемы с формзовськой аутентификацией, которая просто тупо не работала (при любом запросе — логин пейдж), и я так и не смог найти нормального солюшина для этого, а также невозможность разделить доступ на сервере — тоесть если юзер имеет доступ к сервису — он имеет доступ ко всему. Была идея — создать несколько сервисов, и настроить каждый по отдельности, но она шибко извращенная.

Вердикт: слишком сыро. Возможно в 4.0 оно будет юзабельнее, но пока-что: Revert All.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.