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. 首要求:更新CompanyId 8
  2. 首先要求:更新CompanyId 9 !!錯誤

有誰知道如何解決這個問題?

一般承認的答案

已解決: https//github.com/aspnet/EntityFramework/issues/2652

我將Repository添加為Singleton:

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

這意味著所有請求都共享存儲庫的單個實例。您應該將其減少為Scoped,以便每個請求都有一個存儲庫實例。除了避免您遇到的問題之外,它還將確保您最終不會有一個巨大的上下文實例跟踪內存中數據庫中的所有數據。

要解決:

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

熱門答案

您收到此錯誤是因為您的_repository實例已在內存中具有相同鍵的Company實例。當您跨線程重用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合法嗎? 是的,了解原因