Это общий вопрос архитектуры, который, надеюсь, уже используется EF в конечных приложениях.
У нас есть типичное приложение N-уровня:
- Клиент WPF
- Услуги WCF
- EF STE DTO's
- Уровень данных EF
Приложение загружает все известные типы бизнеса во время загрузки (в то же время, когда пользователь входит в систему), а затем загружает очень большую «рабочую партию» по требованию, эта партия составляет около 4–8 Мг и состоит из более чем 1000 операций объекты. Когда мы заканчиваем загрузку этого «Пакета», мы связываем все с ранее загруженными бизнес-типами и т.д ...
В итоге у нас в памяти около 2–5 тыс. Бизнес-объектов, все они правильно ссылаются, поэтому мы можем использовать LINQ на клиентской стороне и злоупотреблять ею, мы также делаем сложную математику для всех этих объектов на клиентской стороне, поэтому нам действительно нужно большой график.
Проблема возникает, когда мы хотим сохранить изменения в базе данных. С таким большим графом объектов мы вряд ли захотим пересылать все заново через Сеть.
Наш текущий подход, который мне не нравится, учитывая сложность шаблонов T4 до сих пор, состоит в том, чтобы отсоединять и прикреплять все при обновлении. Мы в основном хотим обновить данный объект, отсоединить его от остальной части графика, отправить его по сети, обновить его на стороне WCF, а затем снова присоединить его на стороне клиента. Основная проблема заключается в том, что когда вы хотите обновить связанные объекты, скажем, вы добавляете что-то, у которого есть ссылка на что-то, что также добавляется, затем еще одна ссылка на что-то измененное и т. Д. Это заставляет много клиентского кода быть уверенным, что мы не ничего не сломать.
Все это делается с помощью сгенерированного кода, поэтому речь идет о 200-800 строках кода T4 на шаблон.
То, на что я сейчас обращаю внимание, - это способ настроить сериализацию и десериализацию STE, чтобы я мог контролировать, что отправляется по сети или нет, и иметь возможность обновлять пакеты вместо одного STE. Проверяя ссылки, посмотрите, являются ли эти ссылки неизменными или нет; если нет, не сериализуйте, если да, сериализуйте и обновляйте все, просто подключив его к контексту на стороне WCF.
После некоторого изучения я нашел 2 решения этого метода.
Одним из них является написание пользовательского DataContractSerializer.
Второй способ - изменить шаблон STE, созданный EF, и поиграться с KnownTypeAttribute, вместо того, чтобы генерировать его для каждого ссылочного типа, чтобы он ссылался на метод, который проверяет объект, и помечает только те ссылки сериализации, которые не изменились. .
- Кто-нибудь когда-нибудь сталкивался с этим
вопрос раньше?
- Какие решения вы использовали?
- С какими проблемами вы столкнулись?
линия?
- Насколько легко было поддерживать
шаблоны созданы?