среда, ноября 26, 2008

Как разделить EDM на несколько частей?

Похоже, народ начинает пробовать заюзать Entity Framework в реальных проектах. И начинает задавать неудобные вопросы.
Один из самых "горячих" вопросов: как разделить большую модель данных (EDM) на несколько частей. Я уже затрачивал этот вопрос в обсуждениях вот этого поста.
Суть моих рассуждений была такова: делите модель только если ее действительно можно разделить на несколько независимых частей. Иначе делайте большую общую модель и шарьте ее между всеми модулями системы.
Однако, большая модель это не только ценный мех не очень удобно, но это еще и проблемы с производительностью. И вот от разработчиков EF пришла благая весть: EDM все же можно делить на части так, что одна часть будет ссылаться и использовать классы другой части. Для этого есть чудесный аттрибут "using":


<Schema Namespace="NorthwindModel" Alias="Self" xmlns="http://schemas.microsoft.com/ado/2006/04/edm">
<Using Namespace="NorthwindModelBase" Alias="BaseModel" />


Подробно о том, как разделить модель на несколько частей, с пошаговыми инструкциями написано в блоге разработчиков ADO.NET "Working With Large Models In Entity Framework – Part 2"

Есть однако одна неприятная деталь. Точнее две.
Первая, подключаемые модели традиционно не поддерживает дизайнер EDM. Но это можно пережить.
Вторая, модели могут ссылаться друг на друга только в одном направлении, а это автоматически означает, что navigation property, а иными словами, ссылочные свойства на объекты в другой модели запрещены. И это уже плохо. Вернемся к началу моего поста, где я говорил о том, что делить модель на части можно только если эти части не зависимы. Выходит, к сожалению, я был все же прав.

4 комментария:

Анонимный комментирует...

Привет всем!Я имею реальный опыт использования EF. Проблема описанная здесь имеет простое решение (такой же приём применяли и в LINQ to SQL) каждая частичная модель EDM делается в своей папке = namespase и разные EDM не пересекаются! Есть реальные трудности использования EF. Частично я их описал в своём блоге http://www.itcommunity.ru/blogs/mikebb/default.aspx

Анонимный комментирует...

Небольшое добавление. Дизайнер EDM в VS 2008 по мнению многих охватывает 10% функционала и во многих случаях требуется ручная корректировка .edmx Здесь инормация как это деалть http://blogs.msdn.com/adonet/archive/2008/12/17/new-entity-framework-documentation-topics.aspx

Sergey Rozovik комментирует...

> каждая частичная модель EDM делается в своей папке = namespase и разные EDM не пересекаются!

Ну, я в общем-то об этом и говорил в посте. Если части модели не пересекаются, то разделить не проблема.
А вот если какие-то сущности должны присутствовать в обоих моделях, тут возникают сложности. Одна сущность будет представлена в каждой модели своим иклассом, а это не удобно.

Анонимный комментирует...

А не проще реализовать такой класс который бы считывал нужные данные с класса таблиц, а потом записывал это все в edmx файл?