Подробные варианты переноса из EF6 в EF Core

В этом документе подробно описаны некоторые различия между EF6 и EF Core. Обратитесь к этому руководству при переносе кода.

Настройка подключения к базе данных

Существует несколько различий между подключением EF6 к различным источникам данных по сравнению с EF Core. Важно понимать, когда вы переносите код.

  • Строки подключения: EF Core не поддерживает несколько перегрузок конструктора для разных строк подключения, как и EF6. Вместо этого он полагается на DbContextOptions. Вы по-прежнему можете предоставить несколько перегрузок конструктора в производных типах, но потребуется сопоставить подключения с помощью параметров.
  • Конфигурация и кэш: EF Core поддерживает более надежную и гибкую реализацию внедрения зависимостей с внутренней инфраструктурой, которая может подключаться к внешним поставщикам услуг. Это может управляться приложением для обработки ситуаций, когда кэши должны быть промыты. Версия EF6 была ограничена и не может быть сброшена.
  • Файлы конфигурации: EF6 поддерживает конфигурацию с помощью файлов конфигурации, которые могут включать поставщика. ДЛЯ EF Core требуется прямая ссылка на сборку поставщика и явную регистрацию поставщика (т. е. UseSqlServer).
  • Фабрики подключений: поддерживаемые фабрики подключений EF6. EF Core не поддерживает фабрики подключений и всегда требует строки подключения.
  • Ведение журнала: как правило, ведение журнала в EF Core является гораздо более надежным и имеет несколько вариантов для точной настройки конфигурации.

Соглашения

Поддерживаемые пользовательские соглашения ("упрощенный") EF6 и соглашения о модели. Упрощенные соглашения аналогичны конфигурации модели предварительного соглашения EF Core. Другие соглашения поддерживаются как часть построения модели.

После сборки модели ef6 выполняются соглашения. EF Core применяет их по мере сборки модели. В EF Core можно отделить сборку модели от активных сеансов с помощью DbContext. Можно создать модель, инициализированную с помощью соглашений.

Проверка данных

EF Core не поддерживает проверку данных и использует только заметки к данным для создания модели и миграции. Большинство клиентских библиотек из web/MVC в WinForms и WPF обеспечивают реализацию проверки данных для использования.

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

В EF6 есть несколько функций, которые еще не существуют в EF Core, но находятся в стратегии разработки продуктов.

  • Табличный тип (TPC) поддерживался в EF6 вместе с разделением сущностей. TPC находится на схеме развития EF7.
  • Сопоставление хранимых процедур в EF6 позволяет делегировать операции создания, обновления и удаления хранимым процедурам. В настоящее время EF Core позволяет сопоставлять хранимые процедуры только для операций чтения. Поддержка создания, обновления и удаления (CUD) находится в стратегии для EF7.
  • Сложные типы в EF6 похожи на принадлежащие типы в EF Core. Однако полный набор возможностей будет устранен с помощью объектов значений в EF7.

Оставьте ОбъектContext позади

EF Core использует dbContext вместо ObjectContext. Вам потребуется обновить код, использующий IObjectContextAdapter. Иногда это было использовано для запросов с PreserveChanges параметром слияния или OverwriteChanges объединения. Для аналогичных возможностей в EF Core ознакомьтесь с методом перезагрузки .

Конфигурация модели

Существует множество важных различий между тем, как разработаны модели в EF6 и EF Core. EF Core не имеет полной поддержки условного сопоставления. В нем нет версий построителя моделей.

К другим отличиям относятся:

Обнаружение типов

В EF Core типы сущностей обнаруживаются подсистемой тремя способами:

  • Предоставьте сведения о DbSet<TEntity> типе DbContextTEntity , который вы хотите отслеживать.
  • Ссылка на код Set<TEntity> из другого места.
  • Сложные типы, на которые ссылаются обнаруженные типы, рекурсивно обнаруживаются (например, если Blog ссылки и BlogPost доступны для обнаружения, Post также будут обнаружены).

Сборки не сканируются для производных типов.

Сопоставление

Расширение .Map() в EF6 заменено перегрузками и методами расширения в EF Core. Например, можно использовать ". HasDiscriminator()' для настройки таблицы на иерархию (TPH). См. статью "Моделирование наследования".

Сопоставление наследования

EF6 поддерживает таблицу на иерархию (TPH), таблицу на тип (TPT) и таблицу на конкретный класс (TPC) и поддерживает гибридное сопоставление различных вкусов на разных уровнях иерархии. EF Core будет по-прежнему требовать цепочки наследования для моделирования один из способов (TPT или TPH), и план заключается в добавлении поддержки TPC в EF7.

См. статью "Моделирование наследования".

Атрибуты

Поддерживаемые атрибуты индекса EF6 для свойств. В EF Core они применяются на уровне типа, что упрощает сценарии, требующие составных индексов. EF Core не поддерживает составные ключи с заметками к данным (т. е. использование заказа вместе ColumnAttribute с KeyAttribute).

Дополнительные сведения см. в статье "Индексы и ограничения".

Обязательный и необязательный

В сборке модели EF Core настраивается только то, IsRequired что требуется в конце субъекта. HasForeignKey теперь настраивает конец субъекта. Чтобы перенести код, вместо этого будет проще использовать .Navigation().IsRequired() его. Пример:

EF6:

modelBuilder.Entity<Instructor>()
    .HasRequired(t => t.OfficeAssignment)
    .WithRequiredPrincipal(t => t.Instructor);

EF Core 6:

modelBuilder.Entity<Instructor>()
    .HasOne(t => t.OfficeAssignment)
    .WithOne(t => t.Instructor)
    .HasForeignKey<OfficeAssignment>();

modelBuilder.Entity<Instructor>()
    .Navigation(t => t.OfficeAssignment)
    .IsRequired();

modelBuilder.Entity<OfficeAssignment>()
    .Navigation(t => t.Instructor)
    .IsRequired();

По умолчанию все является необязательным, поэтому обычно не требуется вызывать .IsRequired(false).

Пространственные данные (SQL Server)

EF Core интегрируется со сторонней библиотекой сообщества библиотеки NetTopologySuite для обеспечения пространственной поддержки.

Независимые ассоциации

EF Core не поддерживает независимые связи (концепция EDM, которая позволяет определять связь между двумя сущностями независимо от самих сущностей). Аналогичное понятие, поддерживаемое в EF Core, — это свойства тени.

Миграции

EF Core не поддерживает инициализаторы баз данных или автоматические миграции. Хотя в EF Core нет migrate.exe , вы можете создавать пакеты миграции.

Инструменты Visual Studio

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

Хотя эти функции не поставляются с EF Core, существуют проекты сообщества OSS, которые предоставляют дополнительные средства. В частности, EF Core Power Tools предоставляет:

  • Реконструирование из Visual Studio с поддержкой проектов баз данных (.dacpac). Включает настройки кода на основе шаблонов.
  • Визуальная проверка DbContext с помощью графирования моделей и создания скриптов.
  • Управление миграцией из Visual Studio с помощью графического пользовательского интерфейса.

Полный список средств и расширений сообщества см. в статье " Средства и расширения EF Core".

Change tracking

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

Компонент EF6 EF Core
Состояние сущностей Добавляет и присоединяет весь граф Поддерживает переходы к отсоединяемых сущностям
Сирот Сохраняются Deleted
Отключенные сущности самостоятельного отслеживания Поддерживается Не поддерживается
Изменения Выполняется для свойств Выполняется при резервном копировании полей*
Привязка данных .Local .Local плюс .ToObservableCollection или .ToBindingList
Обнаружение изменений Полный график Для каждой сущности

* По умолчанию уведомление о свойствах не будет активировано в EF Core, поэтому важно настроить сущности уведомлений.

Обратите внимание, что EF Core не вызывает обнаружение изменений автоматически, как и EF6.

EF Core содержит подробные DebugView сведения для средства отслеживания изменений. Дополнительные сведения см. в статье "Отладка средства отслеживания изменений".

Запросы

EF6 имеет некоторые возможности запросов, которые не существуют в EF Core. К ним относятся следующие объекты.

  • Некоторые распространенные сопоставления функций C# и SQL.
  • Перехват дерева команд для запросов и обновлений.
  • Поддержка возвращаемых табличным значением параметров (TVP).

EF6 имеет встроенную поддержку отложенных прокси-серверов. Это пакет согласия для EF Core (см. отложенную загрузку связанных данных).

EF Core позволяет создавать необработанные SQL с помощью FromSQL.