C# .NET Core,随机创建重复记录

C# .NET Core,随机创建重复记录,c#,asp.net-core,.net-core,ef-core-2.1,C#,Asp.net Core,.net Core,Ef Core 2.1,我有一个使用EntityFramework核心和ASP.NETCore2.1开发的代码优先的web应用程序。 当我保存数据时,有时它只使用一条记录就可以正确保存。但是,有时它会使用不同的ID保存2条重复记录 Create(company)方法仅从控制器调用一次,但有时会创建两个公司 控制器实现: [ApiController] 公共类公司控制器:控制器数据库 { 私人只读的ICompanyManager(公司管理者); 上市公司控制人(IEmpresaManager公司管理人) { _公司经理=

我有一个使用EntityFramework核心和ASP.NETCore2.1开发的代码优先的web应用程序。 当我保存数据时,有时它只使用一条记录就可以正确保存。但是,有时它会使用不同的ID保存2条重复记录

Create(company)
方法仅从控制器调用一次,但有时会创建两个公司

控制器实现:

[ApiController]
公共类公司控制器:控制器数据库
{
私人只读的ICompanyManager(公司管理者);
上市公司控制人(IEmpresaManager公司管理人)
{
_公司经理=公司经理;
} 
[HttpPost]
公共异步任务发布(CompanyBindingModel companyViewModel)
{
尝试
{
等待_companyManager.Create(_mapper.Map(companyViewModel));
}
捕获(例外情况除外)
{
返回冲突(例如消息);
}
返回Ok(新建{mensage=“公司创建成功”});
}
经理执行:

公共类公司管理者:ICompanyManager
{
私有只读RepositoyBase\u存储库;
上市公司管理者(RepositoyBase存储库){
_存储库=存储库;
}
公共异步任务创建(公司)
{
_添加(公司);
wait_repository.saveChangesSync();
返回公司Id;
}
}
这是我的存储库模式实现,它保存所有实体。 DbContext通过依赖项注入注入并注册为作用域

在Startup.cs中

services.addScope();
存储库实现

使用Microsoft.EntityFrameworkCore;
使用制度;
使用System.Collections.Generic;
使用System.Linq;
使用System.Linq.Expressions;
使用System.Threading.Tasks;
名称空间MyProject.Repositories
{
公共类RepositoryBase:IRepositoryBase
其中tenty:类,tenty
其中TKey:struct
{
受保护的只读DbContext\u DbContext;
公共存储库(DbContext DbContext)
{
_dbContext=dbContext;
}
公共虚拟异步任务GetAll(表达式)
{
return wait_dbContext.Set().Where(expression.toListSync();
}
公共虚拟异步任务Get(表达式)
{
返回wait_dbContext.Set().FindAsync(表达式);
}
公共虚拟异步任务GetById(TKey id)
{
返回wait_dbContext.Set().FindAsync(id);
}
公共虚拟IQueryable GetAll()
{
返回_dbContext.Set().AsNoTracking();
}
公共虚拟空添加(TEntity实体)
{
_dbContext.Set().Add(实体);
}
公共虚拟无效更新(TEntity实体)
{
_dbContext.Set().Update(实体);
}
公共虚拟无效删除(TEntity实体)
{
if(_dbContext.Entry(entity.State==EntityState.Detached)
{
_dbContext.Attach(实体);
}
_dbContext.Set().Remove(实体);
}
公共虚拟无效删除(TKey id)
{
TEntity entityToRemove=_dbContext.Set().Find(id);
_dbContext.Set().Remove(entityToRemove);
}
公共虚拟异步任务SaveChangesAsync()
{
wait_dbContext.saveChangesSync();
}
}
}

这是由我的存储库实现、DbContext注册为作用域还是线程安全引起的?

当您使用DbContext时,通常最好使用
语句。这可能是一个很好的起点(例如:
使用(var context=new ApplicationDbContext()){//db operations here}
这也是确保线程安全的一个好方法。只要每个线程都使用自己的
dbContext
,就可以防止不同线程尝试执行数据库操作时出现问题。在web应用程序中使用using语句不是一种坏做法吗?对象的生命周期由框架管理,所以如果您过早地处理它的话其他调用不会引发异常吗?@Dortimer:问题是关于ASP.NET Core的,DbContext是通过依赖项注入注入的,在请求期间有效。不建议手动在代码中处置DbContext,除非您自己实例化了它(
new
ing)或者您将其解析为瞬态,并知道在此之后不会使用它。由于每个请求作用域的生命周期,它在请求中是线程安全的(除非您尝试对它执行并行调用,而不等待第一个结果,否则它会抛出)@Dortimer ASP.NET核心依赖项注入引擎处理DataContext的处理。它注册为作用域服务,因此如果在应用程序代码中手动处理,则在同一请求中执行的另一段代码可能会发现自己试图使用已处理的对象。前端javascript代码是否有可能调用此端点两次?你能用大摇大摆或邮递员重现错误吗?