Контекст не может быть использован во время создания модели. EF-Core ASP.net Core2.2 - PullRequest
0 голосов
/ 06 марта 2019

Я видел много сообщений о проблеме, но ни одна из них не исправила мою проблему

сценарий Уровень БД с API-контроллерами IDataRepository DataManagers

код

Startup.cs

  public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        services.AddDbContext<ApplicationContext>(opts => opts.UseSqlServer(Configuration["ConnectionString:LawyerApplicationDB"]), ServiceLifetime.Transient);
        services.AddSingleton(typeof(IDataRepository<Clients, long>), typeof(ClientManager));
        services.AddSingleton(typeof(IDataRepository<Nationality, long>), typeof(NationalityManager));
        services.AddMvc();
    }

ApplicationContext

public class ApplicationContext: DbContext
{
    public ApplicationContext(DbContextOptions opts) : base(opts)
    {
    }

    public DbSet<Clients> Clients { get; set; }
    public DbSet<Nationality> Nationalities { get; set; }



}

Диспетчер, где появляется ошибка

 public class NationalityManager : IDataRepository<Nationality, long>
{
    private ApplicationContext ctx; //not static

    public NationalityManager(ApplicationContext c)
    {
        ctx = c;
    }

    public Nationality Get(long id)
    {

        var nationality = ctx.Nationalities.FirstOrDefault(b => b.Id == id);
        return nationality;
    }

    public IEnumerable<Nationality> GetAll()
    {
        var nationalities = ctx.Nationalities.ToList();
        return nationalities;
    }

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

что я делаю не так

это учебник, который я использовал Создание базового приложения ASP.NET с использованием веб-API и разработки кода

Спасибо за вашу помощь

1 Ответ

0 голосов
/ 06 марта 2019

Вы попали в классическую ситуацию, когда вы слишком долго держите контекст вокруг себя.

Поскольку NationalityManager зарегистрирован как одноэлементный, не имеет значения, что ваш контекст был зарегистрирован как временный. Нечто с коротким сроком службы, введенное во что-то с большим сроком службы, фактически означает, что короткое время жизни увеличивается на время жизни дольше.

Вы можете либо сделать объект менеджера короче, либо внедрить фабрику контекста в своего менеджера. Фабрика контекста гарантирует, что ваш (что должно быть недолгим) контекст создается при необходимости.

Если у вас одновременно поступают вызовы API, они пытаются одновременно использовать не потокобезопасный контекст. Первый вызов - это настройка модели, а затем приходит другой вызов, который хочет использовать модель , пока она настраивается .

До EF Core я обратился к этой проблеме с оригинальным EF, разработанным для .NET Framework. Это может дать вам больше информации.

...