簡體   English   中英

EF7 beta6:保存多個實體時出錯

[英]EF7 beta6: Error saving multiple entities

我正在使用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.AddScoped<Data.Interfaces.Company.ICompanyRepository,Data.Repositories.Company.CompanyRepository>();

您收到此錯誤是因為您的_repository實例已在內存中具有相同鍵的Company實例。 當您跨線程重用DbContext實例時,可能會發生這種情況。 上面的示例不包含有關如何實例化CompanyController._repository的代碼。 確保HTTP請求之間不共享此項。

另外,在配置密鑰之前放置此行。

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

即使我面臨同樣的問題。

我在startup.cs文件的Configure方法中將存儲庫注冊為單例。 將其更改為AddScoped此問題。

只需要使用下面的代碼來更新記錄

_dbContext.Company.Update(company);
_dbContext.SaveChanges();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM