Entity Framework: игнорировать столбцы - PullRequest
35 голосов
/ 10 апреля 2009

У меня есть база данных, из которой я хочу построить модель EF, однако я не хочу включать определенные столбцы из базы данных, поскольку соответствующие столбцы поддерживаются исключительно на сервере и не должны обрабатываться никаким приложением.

Оба столбца имеют DateTime (если это имеет какое-либо значение), один из столбцов имеет значение NULL и поддерживается триггером на обновления, а другой не имеет значения NULL и устанавливается с использованием значения по умолчанию в определении таблицы.

Я думаю, что я ищу что-то вроде опции "Сгенерированный сервером" в Linq2Sql; но я не могу найти такой вариант.

Может кто-нибудь сказать мне, как обойти это?

Оговорка:

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

EDIT:

Я думаю, что то, что я ищу здесь, тоже ...

(a) способ создания модели без EF, ссылающейся на столбцы в хранилище (ssdl) и, следовательно, не пытающейся каким-либо образом манипулировать ею (б) способ программной установки атрибута «StoreGeneratedPattern» для свойства при создании ObjectContext (простой ответ - вручную манипулировать этим в .ssdl, но это будет перезаписано, если я обновлю модель из базы данных и Я не могу пойти по маршруту, где .csdl, .msl & .ssdl провернуты вручную).

Ответы [ 6 ]

28 голосов
/ 10 апреля 2009

Можете ли вы сделать это с Entity Framework? Да; это просто. Можете ли вы сделать это с конструктором Entity Framework? К сожалению, это намного сложнее.

Проблема, с которой вы столкнулись, заключается в том, что столбец существует в схеме хранения (SSDL) в вашем EDMX. Удаление столбца с помощью дизайнера графического интерфейса просто удаляет его из схемы клиента, а не из схемы отображения или схемы хранения. Однако достаточно просто зайти в EDMX и удалить его. Сделав это, вы также можете удалить его из сопоставления в частях схемы клиента EDMX, и инфраструктура сущности будет дольше жаловаться, что она не сопоставлена.

Проблема решена, верно?

Ну нет. Когда вы используете дизайнер графического интерфейса для обновления EDMX из базы данных, схема хранилища выбрасывается и создается заново. Так что ваша колонна вернется. Насколько я знаю, нет способа сказать дизайнеру GUI никогда не отображать конкретный столбец. Так что вам придется делать это каждый раз, когда вы обновляете с дизайнером GUI. К счастью, EDMX - это XML, поэтому вы можете сделать это с помощью преобразования XML, LINQ или инструмента XML по вашему выбору.

2 голосов
/ 10 апреля 2009

Не можете ли вы создать представление с нужными вам столбцами, импортировать его с помощью мастера функций сущностей и сопоставить его с вашими сущностями?

1 голос
/ 10 апреля 2009

Вы не хотите, чтобы столбец появился в модели вообще?

Попробуйте выбрать столбец в режиме конструктора и нажмите клавишу удаления.

Редактировать

Вы можете сделать установщик для свойства частным. Тогда ваше приложение не сможет изменить значение.

0 голосов
/ 14 мая 2015

Вы можете изменить текстовый шаблон, чтобы игнорировать эти столбцы при создании классов сущностей. Например, если вы добавили «IGNORE» в сводку документации, вы можете изменить шаблон, игнорируя их, заменив;

Dim simpleProperties as IEnumerable(Of EdmProperty) = typeMapper.GetSimpleProperties(entity)

с *; 1004 *

Dim simpleProperties as IEnumerable(Of EdmProperty) = typeMapper.GetSimpleProperties(entity).Where(Function(p) p.Documentation is nothing orelse p.Documentation.Summary.IndexOf("IGNORE")<0)
0 голосов
/ 01 апреля 2010

Метка времени - это другой тип данных, нежели DateTime. Временная метка, похоже, распознается как атрибут, которым управляет движок, во многом как атрибут идентификации. Вы не можете «обновить» атрибут отметки времени. Следовательно, EDM может управлять им правильно (так же, как это делает личность).

0 голосов
/ 10 апреля 2009

Щелкните правой кнопкой мыши по полю в графическом представлении и выберите «Удалить». Я обнаружил, что иногда вы получаете ошибки, когда вносите много изменений в моделирование сразу и начинаете терять свои изменения. Ваша лучшая ставка могла бы состоять в том, чтобы восстановить сгенерированную модель EF.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...