EF7 beta6: erreur lors de l'enregistrement de plusieurs entités

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

Question

Je crée une API à l'aide de ASP.NET5 et Entity Framework 7.0.0-beta 6, et lorsque j'essaie d'exécuter diverses mises à jour dans plusieurs requêtes, j'obtiens cette exception:

"Société" ne peut pas être suivi, car une autre instance de ce type avec la même clé est déjà suivie. Pour les nouvelles entités, envisagez d'utiliser IIdentityGenerator pour générer des valeurs de clé uniques.

Ceci est mon 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);
        }
    }

}

J'ai essayé de le résoudre en supprimant ValueGeneratedOnAdd () , UseSqlServerIdentityColumns () ou en modifiant le mappage, mais si j'essaie de mettre à jour plusieurs entités dans plusieurs requêtes, j'obtiens l'exception:

  1. Première demande: Update CompanyId 8
  2. Premier req: Update CompanyId 9 !! ERREUR

Est-ce que quelqu'un sait comment résoudre ce problème?

Réponse acceptée

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

J'ajoutais Repository en tant que Singleton:

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

Cela signifie que toutes les demandes partagent une instance unique du référentiel. Vous devez réduire cela à Scoped, afin de disposer d'une seule instance de référentiel par demande. En plus d'éviter le problème que vous rencontrez, cela vous évitera également de vous retrouver avec une gigantesque instance de contexte surveillant toutes les données de votre base de données en mémoire.

Résoudre:

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

Réponse populaire

Vous obtenez cette erreur car votre instance de _repository déjà une instance de Company en mémoire avec la même clé. Cela peut se produire lorsque vous réutilisez une instance de DbContext sur plusieurs threads. Votre exemple ci-dessus n'inclut pas le code CompanyController._repository comment instancier CompanyController._repository Assurez-vous que cela n'est pas partagé entre les requêtes HTTP.

Mettez également cette ligne avant de configurer la clé.

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


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow