Проблема в том, что пакет отложенной загрузки прокси использует соглашение, которое выполняется после того, как модель построена и изменяет ее.Хотя внешняя модель создается без соблюдения этого соглашения, ее функциональность вообще не активируется.
Следующий обходной путь предназначен для последней официальной версии EF Core 2.2.4 на момент написания.Скорее всего, его необходимо будет соответствующим образом обновить, если вы обновитесь до более новой версии EF Core (3.0+) или удалите, если они это исправят.
Код EF Core 2.2.4 из *Используемый вами метод 1007 * выглядит следующим образом:
public static ConventionSet Build()
{
var serviceProvider = new ServiceCollection()
.AddEntityFrameworkSqlServer()
.AddDbContext<DbContext>(o => o.UseSqlServer("Server=."))
.BuildServiceProvider();
using (var serviceScope = serviceProvider.GetRequiredService<IServiceScopeFactory>().CreateScope())
{
using (var context = serviceScope.ServiceProvider.GetService<DbContext>())
{
return ConventionSet.CreateConventionSet(context);
}
}
}
Как видите, он использует некоторые хитрости, наиболее важным из которых является собственный DbContextOptionsBuilder
.Поэтому все, что нам нужно, это добавить вызов UseLazyLoadingProxies()
к этому сборщику.
Для этого создайте приватный статический метод с измененным кодом:
static ConventionSet BuildSqlServerConventionSet()
{
var serviceProvider = new ServiceCollection()
.AddEntityFrameworkSqlServer()
.AddDbContext<DbContext>(o => o.UseSqlServer("Server=.").UseLazyLoadingProxies()) // <--
.BuildServiceProvider();
using (var serviceScope = serviceProvider.GetRequiredService<IServiceScopeFactory>().CreateScope())
{
using (var context = serviceScope.ServiceProvider.GetService<DbContext>())
{
return ConventionSet.CreateConventionSet(context);
}
}
}
и используйте его вместо вызова SqlServerConventionSetBuilder.Build()
, например,
var conventions = BuildSqlServerConventionSet();
// ... the rest
Обновление: Также обратите внимание, что свойство ModelBuilder.Model
возвращает отложенную изменяемую модель во время построения.Чтобы получить готовую модель «готовую к использованию во время выполнения» , замените
return modelBuilder.Model;
на
return modelBuilder.FinalizeModel();
Этот метод выполняется инфраструктурой EF Core "автоматически при использовании OnModelCreating
" .