2015-02-11 1 views
1

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

Так я создаю следующие проекты:

  • MyOrders.Models
  • MyOrders.RestApi
  • MyOrders.Client

Оба проекта RestApi и клиент зависимостей по проекту Модели ,

В RestApi используется Entity Framework (сначала код), поэтому обычно вы должны украшать свойства модели такими вещами, как [NotMapped] и [Key]. Тем не менее, I не хотят, чтобы клиентское решение имело какую-либо зависимость от Entity Framework. Никто. Поэтому я не могу украсить свойства моделей атрибутами, специфичными для EF.

Итак, мой вопрос: есть ли способ правильно установить атрибуты EF для моделей из проекта RestApi, может быть, в конструкторе Context или что-то еще?

+0

Создание отдельных классов сущностей, сопоставить модель данных, а затем создавать сопоставления взад и вперед для ваших клиентских классов. Атрибуты являются конструкцией времени компиляции и не могут быть добавлены во время выполнения. –

+1

Вы можете использовать свободный API кода для определения всего, а не для украшения модели атрибутами. –

ответ

2

Вы можете иметь Pocos в вашем Models проекте, держать их в полном неведении о Entity Framework, и делать отображения в отдельном проекте или в самом RestApi проекте.

Вы можете сделать это с помощью беглого отображения API, например, в OnModelCreating переопределения контекста, который вы создаете в EF-курсе проекта:

modelBuilder.Entity<Order>().HasKey(o => o.OrderID); 
modelBuilder.Entity<Order>().Ignore(o => o.OrderTotal); 

т.д.

1

Это хороший аргумент в пользу использования пользовательских объектов передачи данных, которые не зависят от табличных объектов. Несмотря на то, что он может чувствовать, что избыточный уровень имеет почти дублирующие классы - один как DTO и один как EF Entities - существует еще одна долгосрочная выгода: два набора классов могут варьироваться независимо. Предположим, вы изменили структуру табличной таблицы, но клиенту не нужно знать об этом изменении. Обновите объект EF, но вы оставите DTO самостоятельно, хотя вам, возможно, придется обновить, как вы набираете карту EF в DTO.

Говоря о сопоставлении: EmitMapper может оказать большую помощь при передаче между двумя типами объектов.

+2

:-) Я думаю, мы думаем так же ... вы были немного быстрее ... –

1

Вам необходимо разделить модели доступа к данным от остальной части приложения, используя Data Transfer Objects.

Это даст много преимуществ. Сначала это будет выглядеть, если вы дублируете весь код модели. Но когда ваше приложение растет, вы обнаружите, что нужны данные в представлении, которое отформатировано по-другому, чем то, как оно было или хранится в базе данных. Атрибуты проверки могут быть добавлены очень определенным образом так, как вам нужно.

Сопоставление между ними может осуществляться различными способами. Вручную или с помощью инструмента, как AutoMapper

Смежные вопросы