Я думаю, что ваша проблема вращается вокруг этой проблемы:
http://thatextramile.be/blog/2010/05/why-you-shouldnt-expose-your-entities-through-your-services/
Вы или не собираетесь отправлять ORM-сущности по сети?
Поскольку у вас сервис-ориентированная архитектура. Я (как и автор) не рекомендую эту практику.
Я использую NHibernate. Я называю эти ORM-сущности. Они модель POCO. Но у них есть «виртуальные» свойства, которые допускают ленивую загрузку.
Однако у меня также есть несколько DTO-объектов. Это также POCO. Они не имеют ленивых свойств.
Так что я много "конвертирую". Я увлажняю ORM-сущности (с помощью NHibernate) ... и затем в конечном итоге преобразую их в Domain-DTO-Objects. Да, воняет в начале.
Сервер отправляет Domain-DTO-Objects. НЕТ ленивой загрузки. Я должен заселить их моделью "Goldie Locks" "в самый раз". Ака, если мне нужны Parent (s) с одним уровнем детей, я должен знать об этом заранее и посылать Domain-DTO-Objects таким образом, с нужным количеством гидратации.
Когда я возвращаю Domain-DTO-Objects (от клиента к серверу), я должен полностью изменить процесс. Я конвертирую Domain-DTO-Objects в ORM-Entities. И разрешить NHibernate работать с ORM-сущностями.
Поскольку архитектура "отключена", я выполняю много вызовов (NHiberntae) ".Merge ()".
// ormItem is any NHibernate poco
using (ISession session = ISessionCreator.OpenSession())
{
using (ITransaction transaction = session.BeginTransaction())
{
session.BeginTransaction();
ParkingAreaNHEntity mergedItem = session.Merge(ormItem);
transaction.Commit();
}
}
. Мердж - замечательная вещь. Entity Framework не имеет его. Boo.
Это много настроек? Да.
Я думаю, что это идеально? Нет.
Тем не менее. Поскольку я отправляю в ORM очень простые DTO (Poco), которые не «приправлены», у меня есть возможность переключать ORM, не нарушая мои контракты с внешним миром.
Мой слой данных может быть ADO.NET, EF, NHibernate или любым другим. Я должен написать «Конвертеры», если я переключаюсь, и код ORM, но все остальное изолировано.
Многие люди спорят со мной. Они сказали, что я слишком много делаю, и с ORM-сущностями все в порядке.
Опять же, мне нравится «теперь разрешать любую ленивую загрузку». И я предпочитаю, чтобы мой слой данных был изолирован. Мои клиенты не должны знать или заботиться о моем уровне данных / выборе.
Достаточно тонких различий (или некоторых не столь тонких) между EF и NHibernate, чтобы нарушить план игры.
Мои доменные DTO-объекты на 95% похожи на мои ORM-сущности? Ага. Но это те 5%, которые могут вас шокировать.
Переход от наборов данных, особенно если они заполнены хранимыми процедурами с большим количеством логики в TSQL, не является тривиальным. Но теперь, когда я делаю объектную модель и НИКОГДА не пишу хранимую процедуру, которая не является простыми функциями CRUD, я никогда не вернусь.
И я ненавижу проекты обслуживания с voodoo TSQL в хранимых процедурах. Это больше не 1999. Ну и большинство мест.
Удачи.
PS Без .Merge (в EF) вот что вам нужно сделать в отключенном мире: (Boo microsoft)
http://www.entityframeworktutorial.net/EntityFramework4.3/update-many-to-many-entity-using-dbcontext.aspx