EF7 beta6: errore nel salvataggio di più entità

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

Domanda

Sto creando un'API usando ASP.NET5 e Entity Framework 7.0.0-beta 6, e quando provo a eseguire vari aggiornamenti in diverse richieste, ottengo questa eccezione:

Non è possibile tenere traccia di "Società" perché un'altra traccia di questo tipo con la stessa chiave è già stata tracciata. Per le nuove entità considerare l'utilizzo di un IIdentityGenerator per generare valori chiave univoci.

Questo è il mio codice:

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

}

Ho provato a risolverlo rimuovendo ValueGeneratedOnAdd () , UseSqlServerIdentityColumns () o cambiando il mapping, ma se provo ad aggiornare diverse entità in più richieste, ottengo l'eccezione:

  1. Prima domanda: aggiornamento CompanyId 8
  2. Prima domanda: aggiornare CompanyId 9 !! ERRORE

Qualcuno sa come risolvere questo problema?

Risposta accettata

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

Stavo aggiungendo il repository come Singleton:

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

Ciò significa che tutte le richieste condividono una singola istanza del repository. È necessario ridurlo a Scoped, in modo da disporre di una singola istanza di repository per richiesta. Oltre a evitare il problema che stai colpendo, ti assicurerà anche di non finire con un'enorme istanza di contesto che tiene traccia di tutti i dati dal tuo database in memoria.

Risolvere:

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

Risposta popolare

Si sta verificando questo errore perché l'istanza di _repository ha già un'istanza di Company in memoria con la stessa chiave. Questo può accadere quando riutilizzi un'istanza di DbContext attraverso i thread. Nell'esempio sopra riportato non è incluso il codice relativo al modo in cui CompanyController._repository viene istanziato. Assicurarsi che questo non sia condiviso tra le richieste HTTP.

Inoltre, inserisci questa riga prima di configurare la chiave.

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


Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow