Ситуация. Делаю проект на .Net Core + Entity Framework Core
Использую DB First подход.
Хочу использовать Lazy Loading (По привычке работы с EF 6)
Проблема: стандартный скаффлодинг (через Scaffold-DbContext) не добавляет признака virtual у моделей-таблиц БД что необходимо для Lazy Loading-а.
При попытке запуска получаю ошибку
InvalidOperationException: Navigation property '(PropertyName)' on entity type '(EntityName)' is not virtual. UseLazyLoadingProxies requires all entity types to be public, unsealed, have virtual navigation properties, and have a public or protected constructor.
Как решил вопрос
перешел на скаффолдинг с использованием EF Core Power Tools
Установка:
Visual Studio -> меню Tools/Extensions And Updates
ищем EF Core Power Tools
устанавливаем
Далее скаффолдинг производим через конекстное меню проекта
пункт
EF Core Power Tools/Reverse Engineer
но тут есть нюанс, нужно в сгенерированный файл дбконтекста
добавить конструктор с параметром
public MyDbContext(DbContextOptions<MyDbContext> options)
: base(options)
{
}
Далее, самый важный момент
собственно добавление поддержки Lazy Loading
при скаффолдинге через EF Core Power Tools нужно включить опцию
Customize code using Handlebars Templates
После этого в папке проекта появятся папкf CodeTemplates с подпапками
Чтобы добавить поддержку Lazy Loading в сгенерированный код, измените шаблон Properties.hbs в CSharpEntityType / Partials следующим образом:
УРА!
После следующей генерации таблиц навигационные свойства будут уже виртуальными
см. также
EF.Core, Db First Подход. Ошибка скаффолдинга (Scaffold-DbContext) Build Failure
что помогло
статья
https://stackoverflow.com/questions/50827976/scaffold-dbcontext-not-generating-virtual-navigation-properties-ef-core-2-1
и статья
https://github.com/ErikEJ/EFCorePowerTools/wiki/Reverse-Engineering
Использую DB First подход.
Хочу использовать Lazy Loading (По привычке работы с EF 6)
Проблема: стандартный скаффлодинг (через Scaffold-DbContext) не добавляет признака virtual у моделей-таблиц БД что необходимо для Lazy Loading-а.
При попытке запуска получаю ошибку
InvalidOperationException: Navigation property '(PropertyName)' on entity type '(EntityName)' is not virtual. UseLazyLoadingProxies requires all entity types to be public, unsealed, have virtual navigation properties, and have a public or protected constructor.
Как решил вопрос
перешел на скаффолдинг с использованием EF Core Power Tools
Установка:
Visual Studio -> меню Tools/Extensions And Updates
ищем EF Core Power Tools
устанавливаем
Далее скаффолдинг производим через конекстное меню проекта
пункт
EF Core Power Tools/Reverse Engineer
но тут есть нюанс, нужно в сгенерированный файл дбконтекста
добавить конструктор с параметром
public MyDbContext(DbContextOptions<MyDbContext> options)
: base(options)
{
}
Далее, самый важный момент
собственно добавление поддержки Lazy Loading
при скаффолдинге через EF Core Power Tools нужно включить опцию
Customize code using Handlebars Templates
После этого в папке проекта появятся папкf CodeTemplates с подпапками
Чтобы добавить поддержку Lazy Loading в сгенерированный код, измените шаблон Properties.hbs в CSharpEntityType / Partials следующим образом:
{{spaces 8}}public virtual ICollection<{{nav-property-type}}> {{nav-property-name}} { get; set; }
{{spaces 8}}public virtual {{nav-property-type}} {{nav-property-name}} { get; set; }
УРА!
После следующей генерации таблиц навигационные свойства будут уже виртуальными
см. также
EF.Core, Db First Подход. Ошибка скаффолдинга (Scaffold-DbContext) Build Failure
что помогло
статья
https://stackoverflow.com/questions/50827976/scaffold-dbcontext-not-generating-virtual-navigation-properties-ef-core-2-1
и статья
https://github.com/ErikEJ/EFCorePowerTools/wiki/Reverse-Engineering
Комментариев нет:
Отправить комментарий