Поделиться через


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

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

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

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

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

Оставьте ObjectContext позади

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

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

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

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

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

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

  • Предоставьте сведения DbSet<TEntity> о DbContext том, TEntity где находится тип, который вы хотите отслеживать.
  • Ссылка на код Set<TEntity> из другого места.
  • Сложные типы, на которые ссылаются обнаруженные типы, обнаруживаются рекурсивно (например, если Blog ссылки на Post них и Blog доступны для обнаружения, 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 Tools and Extensions.

отслеживание изменений

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

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

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

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

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

Запросы

EF6 имеет некоторые возможности запросов, которые не существуют в EF Core. Например:

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

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

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