EF7 beta6: ошибка сохранения нескольких объектов

asp.net-core c# entity-framework-core

Вопрос

Я создаю API с использованием ASP.NET5 и Entity Framework 7.0.0-beta 6, и когда я пытаюсь выполнить различные обновления в нескольких запросах, я получаю это исключение:

«Компания» не может быть отслежена, потому что другой экземпляр этого типа с тем же ключом уже отслеживается. Для новых объектов рассмотрим использование генератора IIdentityGenerator для генерации уникальных значений ключа.

Это мой код:

public class MrBellhopContext : DbContext
{

    public DbSet<Company> Company { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Company>(entity =>
        {
            entity.Key(c => c.CompanyId);

            entity.Index(c => c.Name);

            entity.Property(c => c.CompanyId).ValueGeneratedOnAdd();
        });

        modelBuilder.UseSqlServerIdentityColumns();

        base.OnModelCreating(modelBuilder);
    }

}


public class Company
{

    public int CompanyId { get; set; }

    public string Name { get; set; }

    public string Description { get; set; }

    public string Phone { get; set; }

    public string Email { get; set; }

    public short StatusId { get; set; }

}


public class CompanyRepository : ICompanyRepository
{

    MrBellhopContext _dbcontext;


    public async Task UpdateAsync(Company company)
    {
        _dbcontext.Update(company);
        await _dbcontext.SaveChangesAsync();
    }
}



[Route("api/[controller]")]
public class CompanyController : Controller
{


    [HttpPut]
    public async void UpdateAsync([FromBody] Company company)
    {
        if ((!ModelState.IsValid) || (company == null))
        {
            Context.Response.StatusCode = 400;
            return;
        }
        else
        {
            await _repository.UpdateAsync(company);
        }
    }

}

Я попытался решить эту проблему, удалив ValueGeneratedOnAdd () , UseSqlServerIdentityColumns () или изменив сопоставление, но если я попытаюсь обновить несколько объектов в нескольких запросах, я получаю Исключение:

  1. Первый запрос: обновите CompanyId 8
  2. Первый запрос: обновите CompanyId 9! ОШИБКА

Кто-нибудь знает, как решить эту проблему?

Принятый ответ

Решено: https://github.com/aspnet/EntityFramework/issues/2652

Я добавлял репозиторий в качестве Singleton:

services.AddSigleton<Data.Interfaces.Company.ICompanyRepository,Data.Repositories.Company.CompanyRepository>();

Это означает, что все запросы обмениваются одним экземпляром репозитория. Вы должны уменьшить это до Scoped, так что у вас есть один экземпляр репозитория для каждого запроса. Помимо того, что вы избегаете проблемы, которую вы нажимаете, она также гарантирует, что вы не получите гигантский экземпляр контекста, который отслеживает все данные из вашей базы данных в памяти.

Решать:

services.AddScoped<Data.Interfaces.Company.ICompanyRepository,Data.Repositories.Company.CompanyRepository>();

Популярные ответы

Вы получаете эту ошибку, потому что ваш экземпляр _repository уже имеет экземпляр Company в памяти с тем же ключом. Это может произойти, если вы повторно используете экземпляр DbContext для потоков. В приведенном выше примере не содержится код о том, как CompanyController._repository экземпляр CompanyController._repository . Убедитесь, что это не разделяется между HTTP-запросами.

Кроме того, поставьте эту строку перед настройкой ключа.

entity.Property(c => c.CompanyId).ValueGeneratedOnAdd();


Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow