ASP.NET Core проблема с асинхронными запросами в базу данных

133
02 марта 2018, 13:52

У меня возникла проблема с выполнением асинхронных запросов к базу данных при использовании Entity Framework. Когда я пытаюсь получить какое - либо значение из бд, например:

[Authorize]
    public async Task<IActionResult> Edit(int? id)
    {
        if (id != null)
        {
            Worker worker = await _context.Workers.FirstOrDefaultAsync(w => w.ID == id);
            if (worker != null)
            {
                return View(worker);
            }
        }
        return NotFound();
    }

То появляется следующее исключение:

The provider for the source IQueryable doesn't implement IDbAsyncQueryProvider. Only providers that implement IDbAsyncQueryProvider can be used for Entity Framework asynchronous operations.

Вот класс контекста доступа для бд:

public class EnterChatContext : DbContext
{
    public EnterChatContext(DbContextOptions<EnterChatContext> options) : base(options)
    {
    }
    public DbSet<User> Users { get; set; }
    public DbSet<TopicMessage> TopicMessages { get; set; }
    public DbSet<Topic> Topics { get; set; }
    public DbSet<Note> Notes { get; set; }
    public DbSet<GroupChatMessage> GroupChatMessages { get; set; }
    public DbSet<File> Files { get; set; }
    public DbSet<Company> Companies { get; set; }
    public DbSet<Worker> Workers { get; set; }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        foreach (var relationship in modelBuilder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys()))
        {
            relationship.DeleteBehavior = DeleteBehavior.Restrict;
        }
        modelBuilder.Entity<User>().ToTable("User");
        modelBuilder.Entity<TopicMessage>().ToTable("TopicMessage");
        modelBuilder.Entity<Topic>().ToTable("Topic");
        modelBuilder.Entity<Note>().ToTable("Note");
        modelBuilder.Entity<GroupChatMessage>().ToTable("GroupChatMessage");
        modelBuilder.Entity<File>().ToTable("File");
        modelBuilder.Entity<Company>().ToTable("Company");
        modelBuilder.Entity<Worker>().ToTable("Worker");
    }
}

Вот класс модели Worker

public class Worker 
{
    public int ID { get; set; }
    public int CompanyID { get; set; }
    [Required(ErrorMessage = "Пожалуйста, введите имя работника!")]
    public string FirstName { get; set; }
    [Required(ErrorMessage = "Пожалуйста, введите фамилию работника!")]
    public string SecondName { get; set; }
    public bool Status { get; set; }
    public string StringStatus
    {
        get
        {
            if (Status == true) return "Да";
            else return "Нет";
        }
    }
    [Required(ErrorMessage = "Пожалуйста, введите пригласительный код для работника!")]
    public int? InviteCode { get; set; }
    public Company Company { get; set; }
}

Я никак не могу найти могу найти информации по данному исключению. Я так понимаю проблема с классом контекста, нужно использовать что-то другое вместо DbSet<>...

Answer 1

Точно ответить не могу, но везде рекомендуют установить NuGet пакет Ссылка на англоязычный форму с таким же вопросом

Answer 2

Проблема заключалась в конфликте EntityFramework и EntityFrameworkCore. Асинхронные методы просто обращались не к той реализации, которой нужно. Я убрал EntityFramework из проекта и использовал директиву

using Microsoft.EntityFrameworkCore;
READ ALSO
Синхронизация nullable переменной между потоками

Синхронизация nullable переменной между потоками

Имеется nullable переменная, к которой требуется доступ из разных потоковНапример, int?

120
Путаница в IPv6 локальных адресах

Путаница в IPv6 локальных адресах

Есть один сетевой адаптер, мне нужно узнать его локальный IPv6, для отправки запросов с сокета (сокет в режиме DualMode) через этот IP

128
Ответ клиенту StreamWriter

Ответ клиенту StreamWriter

Мне необходимо отправить ответ клиенту после подключении 1 байтКлиент подключается, по мануалу, после подключения, я должен отправить ответ...

144
Изменение текстовых полей на сайте с помощью C#

Изменение текстовых полей на сайте с помощью C#

Нужно с помощью C# авторизоваться на сайте и внести изменения на нёмВ моём случае, сайт — настройки майнинг машины

149