当前位置: 首页 > 编程语言 > C#

EF7beta6-ErrorsavingmultipleentitiesSharing

时间:2023-04-10 14:59:58 C#

EF7beta6:Errorsavingmultipleentities我正在使用ASP.NET5和EntityFramework7.0.0-beta6创建API,当我尝试执行各种更新时在请求中,我收到以下异常:无法跟踪“公司”,因为已跟踪具有相同密钥的此类型的另一个实例。对于新实体,请考虑使用IIdentityGenerator生成唯一键值。这是我的代码:publicclassMrBellhopContext:DbContext{publicDbSetCompany{get;放;}protectedoverridevoidOnModelCreating(ModelBuildermodelBuilder){modelBuilder.Entity(entity=>{entity.Key(c=>c.CompanyId);entity.Index(c=>c.Name);entity.Property(c=>c.CompanyId).ValueGeneratedOnAdd();});modelBuilder.UseSqlServerIdentityColumns();base.OnModelCreating(模型构建器);}}publicclassCompany{publicintCompanyId{get;放;}公共字符串名称{得到;放;}公共字符串描述{得到;放;}publicstringPhone{get;放;}公共字符串电子邮件{得到;放;}publicshortStatusId{get;放;}}publicclassCompanyRepository:ICompanyRepository{MrBellhopContext_dbcontext;公共异步任务UpdateAsync(公司公司){_dbcontext.Update(公司);等待_dbcontext.SaveChangesAsync();}}[Route("api/[controller]")]publicclassCompanyController:Controller{[HttpPut]publicasyncvoidUpdateAsync([FromBody]公司company){if((!ModelState.IsValid)||(company==null)){Context.Response.StatusCode=400;返回;}else{await_repository.UpdateAsync(公司);我尝试通过删除ValueGeneratedOnAdd()、UseSqlServerIdentityColumns()或更改映射来解决它,但是如果我尝试在多个请求中更新多个实体,我会得到异常:第一个请求:更新CompanyId8第一个请求:更新CompanyId9!!错误有谁知道如何解决这个问题?已解决:https://github.com/aspnet/EntityFramework/issues/2652我将存储库添加为单例:services.AddSigleton();这意味着所有请求都共享存储库的一个实例,您应该将其缩减为Scoped,以便每个请求都有一个存储库实例。除了避免您遇到的问题外,它还将确保您最终不会得到一个巨大的上下文实例来跟踪内存数据库中的所有数据。修复:services.AddScoped();您收到此错误是因为您的_repository实例在内存中已有一个具有相同密钥的Company实例。当您跨线程重用DbContext实例时,可能会发生这种情况。上面的示例不包含有关如何实例化CompanyController._repository的代码。确保这不会在HTTP请求之间共享。另外,将此行放在配置键之前。entity.Property(c=>c.CompanyId).ValueGeneratedOnAdd();即使我也面临同样的问题。我在startup.cs文件的Configure方法中将存储库注册为单例。将其更改为AddScoped解决了这个问题。只需使用以下代码更新记录以上就是C#学习教程:EF7beta6:Errorwhensavingmultipleentities全部内容分享,如果对大家有用还需要详细了解C#学习教程,希望大家多多指教多加注意——_dbContext.Company.Update(company);_dbContext.SaveChanges();本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: