EF7 beta6: Error al guardar varias entidades

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

Pregunta

Estoy creando una API usando ASP.NET5 y Entity Framework 7.0.0-beta 6, y cuando intento ejecutar varias actualizaciones en varias solicitudes, obtengo esta excepción:

"Empresa" no se puede rastrear porque ya se está rastreando otra instancia de este tipo con la misma clave. Para las nuevas entidades, considere usar un IIdentityGenerator para generar valores clave únicos.

Este es mi código:

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);
        }
    }

}

He intentado resolverlo eliminando ValueGeneratedOnAdd () , UseSqlServerIdentityColumns () o cambiando la asignación, pero si trato de actualizar varias entidades en varias solicitudes, obtengo la Excepción:

  1. Primer requisito: Actualizar CompanyId 8
  2. Primer req: Actualizar CompanyId 9 !! ERROR

¿Alguien sabe como resolver este problema?

Respuesta aceptada

Resuelto: https://github.com/aspnet/EntityFramework/issues/2652

Yo estaba agregando Repository como Singleton:

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

Esto significa que todas las solicitudes comparten una sola instancia del repositorio. Debe reducir esto a Scoped, para que tenga una única instancia de repositorio por solicitud. Además de evitar el problema que está afectando, también se asegurará de que no termine con una instancia de contexto gigantesca que rastree todos los datos de su base de datos en la memoria.

Resolver:

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

Respuesta popular

Recibirá este error porque su instancia de _repository ya tiene una instancia de Company en la memoria con la misma clave. Esto puede suceder cuando está reutilizando una instancia de DbContext a través de subprocesos. Su muestra anterior no incluye el código sobre cómo se CompanyController._repository instancia de CompanyController._repository . Asegúrese de que esto no se comparte entre las solicitudes HTTP.

Además, ponga esta línea antes de configurar la clave.

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



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué