EF7 beta6 : 여러 엔터티를 저장하는 중 오류가 발생했습니다.

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

문제

ASP.NET5 및 Entity Framework 7.0.0-beta 6을 사용하여 API를 만들고 여러 요청에서 다양한 업데이트를 실행하려고하면이 예외가 발생합니다.

동일한 키를 가진이 유형의 다른 인스턴스가 이미 추적되므로 '회사'를 추적 할 수 없습니다. 새로운 엔티티의 경우 고유 한 키 값을 생성하기 위해 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. 첫 번째 req : Update CompanyId 8
  2. 첫 번째 req : Update CompanyId 9 !! 오류

누구든지이 문제를 해결하는 방법을 알고 있습니까?

수락 된 답변

해결됨 : https://github.com/aspnet/EntityFramework/issues/2652

나는 저장소를 싱글 톤으로 추가하고 있었다 :

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

즉, 모든 요청이 저장소의 단일 인스턴스를 공유하고 있음을 의미합니다. 이것을 Scoped로 줄여서 요청 당 하나의 저장소 인스턴스를 갖도록해야합니다. 당신이 치고있는 문제를 피하는 것 외에도, 데이터베이스의 모든 데이터를 메모리에서 추적하는 거대한 컨텍스트 인스턴스로 끝나지 않도록 할 수 있습니다.

해결하다:

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

인기 답변

_repository 의 인스턴스에 동일한 키가있는 메모리에 Company 인스턴스가 이미 _repository 오류가 발생합니다. 이 문제는 스레드에서 DbContext 인스턴스를 다시 사용할 때 발생할 수 있습니다. 위의 샘플에는 CompanyController._repository 가 인스턴스화되는 방법에 대한 코드가 포함되어 있지 않습니다. HTTP 요청간에 공유되지 않는지 확인하십시오.

또한 키를 구성하기 전에이 행을 두십시오.

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



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.