C# 访问web API方法时EF代码优先并发

C# 访问web API方法时EF代码优先并发,c#,.net,asp.net-mvc,api,ef-code-first,C#,.net,Asp.net Mvc,Api,Ef Code First,我有这个案子。FileController中我的Web Api方法被多个用户同时访问,其中一些用户试图同时插入相同的记录。我检查了“if the record exists return error”,但由于同时访问了该方法,因此上下文尚未更新,因此数据库中不存在该记录,而是由两个或更多线程插入 [HttpPost] [Route("api/Files/Import")] public HttpResponseMessage Import(ImportFileReques

我有这个案子。FileController中我的Web Api方法被多个用户同时访问,其中一些用户试图同时插入相同的记录。我检查了“if the record exists return error”,但由于同时访问了该方法,因此上下文尚未更新,因此数据库中不存在该记录,而是由两个或更多线程插入

    [HttpPost]
    [Route("api/Files/Import")]
    public HttpResponseMessage Import(ImportFileRequest request)
    {
      using (var transactionMgr = managerTransactions.BeginTransaction()) //here BeginTransaction returns context.Database.BeginTransaction()
      {          

       if(!managerTransactions.FilesRepository.FileExists(request.FileName)) 
       {
          File file = new File();
          file.Name = request.FileName;
          //other properties
          managerTransactions.FilesRepository.Add(file);
          managerTransactions.SaveCahnges();
          transactionMgr.Commit();
      }
      else
      { 
         throw new Exception("File exists");  
      }
    }
   }

因此,在Save方法之前,两个线程已经输入了该方法并添加了文件。在第一个线程上执行Save之前的第二个线程entyered,并将两条记录添加到上下文中。然后执行保存并在数据库中添加两个文件。我无法使用TransactionScope,因为我们的客户不希望安装此必须安装的服务。我尝试使用lock对象,它似乎可以工作,但我不知道这是否是一个好主意

为什么不在文件名上添加一个唯一的约束并捕获该异常?您应该使用
乐观并发
。你可以使用分布式锁机制来确保一次只能有一个线程执行一项任务。或者,您可以在数据库级别为适当的字段提供唯一约束。这两种方法都必须为数据选择唯一标识符。