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

У меня есть проект с небольшой моделью данных, которая потребляет EF-модели только для чтения.

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

Как я могу избежать включения таких столбцов? Могу ли я поместить EF в режим только для чтения в модели данных, который позволит мне удалить столбцы из объектов?

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

EDIT: В моей схеме есть таблицы с столбцами NOT NULL, не имеющими значений по умолчанию. Насколько я могу судить, мне необходимо включить эти столбцы в мой edmx. В моей ситуации у меня есть только контекст только для чтения, поэтому я не хочу, чтобы эти столбцы были включены в мой edmx вообще.

Если я могу помешать столбцам находиться в модели данных, я могу предотвратить многие проблемы, связанные с изменением схемы. Единственное решение, которое я нашел до сих пор, - это построить datamodel, указав на "поддельную" базу данных, в которой нет столбцов!

Ответ 1

Согласно MSDN, QueryView предназначен именно для описанного вами сценария.

Элемент QueryView при отображении языка спецификаций (MSL) определяет сопоставление только для чтения между типом сущности или ассоциацией в концептуальной модели и таблицей в базовой базе данных.

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

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

... (больше сценариев на странице)

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

Вот ссылка на соответствующую документацию MSDN:
https://msdn.microsoft.com/en-us/library/cc716798(v=vs.100).aspx

Если ссылка отключена, выполните поиск QueryView MSL.

Ответ 2

Вы ищете аннотацию данных [NotMapped]?

Если вы используете его в свойстве внутри модели, он не переходит к db.

Ответ 3

Если вы хотите использовать код сначала вместо базы данных, сначала это может быть очень просто.

Возьмем, к примеру, образец базы данных Microsoft School. Он имеет таблицу Course с рядом обязательных полей. Но возможно отобразить класс с небольшим подмножеством этих полей...

class Course
{
    public int CourseID { get; private set; }
    public string Title { get; private set; }
}

... в эту таблицу, игнорируя обязательные поля Credits и DepartmentID.

Свободное отображение в контексте OnModelCreating override -

modelBuilder.Entity<Course>().HasKey(a => a.CourseID);
modelBuilder.Entity<Course>().Property(a => a.CourseID)
                   .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

Как вы видите, я определил свойства с помощью частного сеттера. У EF нет проблем с этим, и он сообщает любому потребителю модели, что модель доступна только для чтения.

Кроме того, вы могли бы даже сопоставить не-ключевые свойства как Computed:

modelBuilder.Entity<Course>().Property(a => a.Title)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);

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

Ответ 4

Я могу предотвратить многие проблемы, связанные с изменением схемы.

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

но я должен иметь их, если они не являются нулевыми и не имеют значений по умолчанию.

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

Любое изменение схемы может повлиять на ряд факторов, таких как новые ограничения, триггеры и общие изменения таблицы. Сокрытие столбцов в дизайнере, а затем надеяться, что он работает в другой базе данных schema-d, не является разумным.

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

Я уменьшаю риск взлома моих потребителей данных, если схема изменяется.

Как именно эти потребители обращаются к данным?

Любой истинный потребитель должен пройти либо через webservice, либо через factory уровень доступа к шаблону, где данные должны быть возвращены только как Interface тип объекта данных. Поэтому, когда/если изменения базы данных или схемы, интерфейс (ы), возвращаемые do/не меняются; следовательно, обновление схемы не нарушает безопасность потребителя за интерфейсом независимо от конкретного используемого объекта.

Это не тот ответ, который вы хотите, но это дает две альтернативы для достижения той же цели.

Ответ 5

Вы также можете устранить эту проблему, удалив ненужные свойства из раздела модели хранилища edmx.