c# – EF7 beta6:保存多个实体时出错
发布时间:2020-12-16 00:25:35 所属栏目:百科 来源:网络整理
导读:我正在使用ASP.NET5和Entity Framework 7.0.0-beta 6创建API,当我尝试在多个请求中执行各种更新时,我得到以下异常: 无法跟踪“公司”,因为已经跟踪了具有相同密钥的此类型的另一个实例.对于新实体,请考虑使用IIdentityGenerator生成唯一键值. 这是我的代码
我正在使用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()或更改映射来解决它,但如果我尝试更新多个请求中的多个实体,我会得到异常: >首先要求:更新CompanyId 8 有谁知道如何解决这个问题? 解决方法
决议:
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>(); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |