EF7 beta6: Fehler beim Speichern mehrerer Entitäten

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

Frage

Ich erstelle eine API mit ASP.NET5 und Entity Framework 7.0.0-Beta 6, und wenn ich versuche, verschiedene Updates in mehreren Anfragen auszuführen, bekomme ich diese Ausnahme:

'Firma' kann nicht verfolgt werden, da bereits eine andere Instanz dieses Typs mit demselben Schlüssel verfolgt wird. Bei neuen Entitäten sollten Sie einen IIdentityGenerator verwenden, um eindeutige Schlüsselwerte zu generieren.

Das ist mein Code:

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

}

Ich habe versucht, es zu lösen, indem ich ValueGeneratedOnAdd () , UseSqlServerIdentityColumns () lösche oder die Zuordnung ändere , aber wenn ich versuche, mehrere Entitäten in mehreren Anforderungen zu aktualisieren, erhalte ich die Ausnahme:

  1. Erste Anforderung: Update CompanyId 8
  2. Erste Anforderung: Update CompanyId 9 !! ERROR

Kann jemand dieses Problem lösen?

Akzeptierte Antwort

Gelöst: https://github.com/aspnet/EntityFramework/issues/2652

Ich habe das Repository als Singleton hinzugefügt:

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

Dies bedeutet, dass alle Anfragen eine einzelne Instanz des Repositorys gemeinsam nutzen. Sie sollten dies auf Scoped reduzieren, sodass Sie pro Anfrage eine einzige Repository-Instanz haben. Abgesehen von der Vermeidung des Problems, das Sie treffen, wird es auch sicherstellen, dass Sie nicht mit einer gigantischen Kontextinstanz enden, die alle Daten aus Ihrer Datenbank im Speicher verfolgt.

Lösen:

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

Beliebte Antwort

Sie erhalten diesen Fehler, weil Ihre Instanz von _repository bereits eine Instanz von Company im Speicher mit demselben Schlüssel hat. Dies kann passieren, wenn Sie eine Instanz von DbContext über Threads hinweg wiederverwenden. Ihr Beispiel oben enthält nicht den Code darüber, wie CompanyController._repository instanziiert wird. Stellen Sie sicher, dass dies nicht zwischen HTTP-Anfragen geteilt wird.

Legen Sie diese Zeile auch fest, bevor Sie den Schlüssel konfigurieren.

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


Related

Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow