Подтвердить что ты не робот

Entity Framework: игнорировать столбцы

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

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

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

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

Протест:

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

EDIT:

Я предполагаю, что то, что я ищу здесь, - это...

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

Разве вы не хотите, чтобы столбец отображался в модели вообще?

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

Edit

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

Ответ 4

Щелкните правой кнопкой мыши по полю в графическом представлении и выберите delete. Ive обнаружил, что иногда вы будете получать ошибки, когда вы вносите много изменений в моделирование сразу и начинаете терять следы своих изменений. Лучше всего будет перестроить созданную EF модель.

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

Ответ 5

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

Ответ 6

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

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

с;

Dim simpleProperties as IEnumerable(Of EdmProperty) = typeMapper.GetSimpleProperties(entity).Where(Function(p) p.Documentation is nothing orelse p.Documentation.Summary.IndexOf("IGNORE")<0)