Entity Framework Code First с существующим представлением базы данных

Моя команда начинает новый проект, используя Entity Framework Code First. У нас есть новая, пустая база данных для проекта; схема будет управляться с помощью миграций Code First.

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

Из-за этой настройки у нас есть два конкурирующих требования:

  1. При создании миграции Entity Framework не должен не пытаться создать или изменить представление.
  2. Во время выполнения мы по-прежнему должны иметь возможность запрашивать/вставлять/обновлять/удалять данные через представление с помощью Entity Framework, как если бы это была обычная таблица.

Мы рассмотрели как атрибут [NotMapped], так и метод .Ignore(), но, похоже, оба они удовлетворяют только одному из двух требований, приведенных выше.

Возможна ли эта конфигурация с использованием Entity Framework Code First или нам нужно будет переключиться на Database First?

Мы используем Entity Framework Core версии 2.1.1.


person Nathan Friend    schedule 16.08.2018    source источник


Ответы (1)


Не существует конфигурации, которая бы удовлетворяла обоим требованиям, и я не вижу, как бы помогла Database First (или Code Second), поскольку проблема связана с миграцией, а не с отображением.

Требование № 2 можно легко выполнить, отобразив представление в виде таблицы (традиционно, [Table] аннотация данных или ToTable свободный API). Для операций EF CRUD на самом деле не имеет значения, является ли фактический объект базы данных с таким именем таблицей или представлением, если он поддерживает соответствующие команды SQL.

Требование № 1 не может быть удовлетворено вышеприведенным решением, но его можно легко обойти. Поскольку EF Core требует предварительно созданных миграций кода (автоматическая миграция, такая как EF6, невозможна), вы можете вручную изменить миграции, содержащие CreateTable в Up / DropTable в Down, и просто удалить их.

На самом деле существует также решение, основанное на пользовательском MigrationSqlGenerator, но это сложнее и не стоит усилий только для одного представления.

person Ivan Stoev    schedule 16.08.2018