Наследование объектов POCO в EF? - PullRequest
0 голосов
/ 26 января 2012

Я пытаюсь решить следующую проблему, используя EF, сначала код и pocos:

Допустим, у меня есть приложение, которое должно обслуживать разных клиентов. Каждый клиент получает свою собственную базу данных и модель, поэтому я создам одну модель и один проект репозитория для каждого клиента.

Проблема в том, где я должен поместить бизнес-код, общий для всех установок? В традиционном ООП у меня была бы одна библиотека классов с кучей базовых классов, определяющих основное поведение - например, UserBase, ArticleBase, константы, служебные методы и т. Д. Затем в проекте, ориентированном на клиента, я бы унаследовал класс от этого базового класса и расширил бы его данные и поведение, например. Клиент1Пользователь: Пользователь или Клиент1Артикул: ArticleBase.

Моя первая идея состояла в том, чтобы иметь общую библиотеку классов с файлом edmx, определяющим базовые классы и их отношения. С помощью шаблона tt я сгенерировал классы POCO и по желанию добавил некоторый пользовательский код В своей пользовательской библиотеке, созданной для каждого клиента, я ссылался на эту базовую библиотеку и создавал конкретные классы, унаследованные от общей библиотеки или совершенно новых классов. В пользовательской библиотеке я также создал специфичный для клиента edmx и использовал шаблон t4 для генерации POCO. Я также создал отдельный проект репозитория для обработки постоянства и запросов. В классе репозитория у меня есть куча свойств DbSet ClassnameSet, которые я должен иметь возможность запрашивать.

Проблема в том, что я не могу этого сделать, и я постоянно сталкиваюсь с исключением метаданных - класс A не является частью текущей модели или

Указанная схема недействительна. Ошибки: отношения "ххх" не было загружен, потому что тип 'model.User' недоступен. Следующие информация может быть полезна при устранении предыдущей ошибки: База Тип «BaseLibrary.BaseUser» типа «ClientLibrary.Model.User» делает не соответствует базовому типу модели 'model.User'.

Спасибо за любую помощь в разрешении этой тайны. Или для того, чтобы направить меня в другом направлении для достижения моей цели.

Tvrtko

1 Ответ

0 голосов
/ 26 января 2012

Я бы начал думать о вашей "архитектуре". Наличие отдельной модели и «хранилища» для каждого клиента является излишним. Используйте один слой доступа к данным и сделайте свое приложение настраиваемым и расширяемым для удовлетворения потребностей всех ваших клиентов.

Проблема этого сценария заключается в наследовании типов между базовой библиотекой и клиентской библиотекой. Прежде всего, вы не сможете иметь EDMX в базовой библиотеке - вам придется создавать новые в каждой клиентской библиотеке. Вам также придется принять решение, если вы хотите использовать в отображении определенные типы клиентов или базовые типы. Использование базовых типов означает использование отображения наследования для каждого объекта. Использование клиентских типов, вероятно, приведет к вашему текущему исключению - ваши базовые типы, вероятно, определяют свойства навигации, указывающие на другие базовые типы - это невозможно, если вы не отображаете базовые типы в клиентской библиотеке.

...