EF и n-tier
От: Аноним  
Дата: 09.10.09 13:08
Оценка:
Используем EF в многозвенной архитектуре.
Есть два модуля:
— один обеспечивает на удаленном клиенте возможность выполнять запросы через EF-контекст. То есть по сути на клиенте работа ведется с неким локальным контекстом, а фактически сериализованный LINQ-запрос отправляется на сервер, там выполняется на EF-контексте и обратно возвращает результирующие объекты (типа ADO.NET DataServices, но без привязки к http-транспорту). Запрос выполняется на сервере.
— другой модуль обеспечивает возможность работать с EF-объектами в памяти. То есть сначала нужно загрузить некий слепок объектов в локальный контекст, с которыми необходимо вести работу. Соответственно после этого все запросы выполняются только на локальном контексте, но при этом все изменения (удаления/обновления) передаются по необходимости на сервер где и применяются к EF-контексту. Например можно завести транзакцию, работать с локальным контекстом (только в памяти), а при коммите все изменения отправлять на сервер. Запрос выполняется не на сервере (на клиенте или каком-то промежуточном слое).

Серьезным недостатком первого подхода является то, что сильно нагружается сеть, так как каждый запрос ведет к выполнению запроса на EF-контексте и к передачи объектов с сервера на клиент. То есть если 2 раза выполнить один и тот же запрос, то оба раза все объекты "честно" будут заново запрошены и переданы клиенте (иногда одно такое сообщение весит 8 метров и выполняется на слабом канале).
Этот недостаток решается вторым подходом (или комбинацией подходов: первый модуль находится со вторым в локальной сети, а БД с серверным обработчиком удаленные).
Но у второго подхода — явный недостаток, что нужно грузить сразу всю сцену (или только необходимые объекты, но достаточно сложно определять какие объекты нужны, а какие нет). Также дополнительные расходы идут на синхронизацию этого контекста с БД (если БД будет изменена не из этого контекста).

В общем, хочется найти какую-то "золотую середину" между первым и вторым подходами. То есть, чтобы не нужно было сразу грузить всю сцену, а объекты загружать при необходимости, но чтобы при этом много раз не гонять одни и те же объекты.
Мы работаем только с EF, поэтому нужно решение на базе EF.
Есть у кого какие идеи? Как вообще можно нормально использовать EF в многозвенке (без ADO.NET DataServices, но используя WCF для коммуникациями между модулями)?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.