EF7 beta6:错误保存多个实体 [英] EF7 beta6: Error saving multiple entities
问题描述
我创建使用ASP.NET5和Entity Framework 7.0.0-β6的API,当我尝试在多个请求执行各种更新,我得到这个异常:
I am creating an API using ASP.NET5 and Entity Framework 7.0.0-beta 6, and when I try to execute various updates in several requests, I get this Exception:
公司不能被跟踪,因为这种类型的具有相同键的另一个实例已被跟踪。对于新的实体考虑使用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()的或更改映射,但如果我尝试在多个请求来更新多个实体,我得到异常:
I have tried to solve it by removing ValueGeneratedOnAdd(), UseSqlServerIdentityColumns() or changing the mapping, but if I try to update several entities in several requests, I get the Exception:
- 首先REQ:更新CompanyId 8
- 首先REQ:更新CompanyId 9!错误
有谁知道如何解决这个问题呢?
推荐答案
解决: https://github.com/aspnet/EntityFramework /问题/ 2652
我添加的存储库作为辛格尔顿:
I was adding Repository as a Singleton:
services.AddSigleton<Data.Interfaces.Company.ICompanyRepository,Data.Repositories.Company.CompanyRepository>();
的这意味着所有的请求都共享库的单个实例。你应该这样降低作用域,让你有每个请求单个存储库实例。除了避免你打的问题,它也将确保你不会与一个巨大的上下文实例跟踪从您的数据库中的所有数据在内存中结束了。的
要解决:
services.AddScoped<Data.Interfaces.Company.ICompanyRepository,Data.Repositories.Company.CompanyRepository>();
这篇关于EF7 beta6:错误保存多个实体的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!