Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 在EF Core中处理DbUpdateConcurrencyException_Entity Framework_.net Core_Ef Core 2.0_Ef Core 2.1_Ef Core 2.2 - Fatal编程技术网

Entity framework 在EF Core中处理DbUpdateConcurrencyException

Entity framework 在EF Core中处理DbUpdateConcurrencyException,entity-framework,.net-core,ef-core-2.0,ef-core-2.1,ef-core-2.2,Entity Framework,.net Core,Ef Core 2.0,Ef Core 2.1,Ef Core 2.2,我使用的是EF Core 2.2.4。所有SQL表都有timestamp列。我有下面的方法,尝试为给定用户获取下一个工作订单。如果有多个用户同时竞争,我们可能会得到DbUpdateConcurrencyException,我使用重试逻辑处理它 注意,DBCntext作为作用域实例注入到服务的构造函数中 public async Task<WorkOrder> GetNextOrder(int userID) { var maxTry = 3;

我使用的是EF Core 2.2.4。所有SQL表都有
timestamp
列。我有下面的方法,尝试为给定用户获取下一个工作订单。如果有多个用户同时竞争,我们可能会得到DbUpdateConcurrencyException,我使用重试逻辑处理它

注意,DBCntext作为
作用域
实例注入到服务的构造函数中

    public async Task<WorkOrder> GetNextOrder(int userID)
    {
        var maxTry = 3;            

        WorkOrder order = null;

            for (int i = 0; i < maxTry; i++)
            {
                order = await _dbContext.WorkOrder
                    .Where(o => o.UserID == null)
                    .OrderBy(o => o.CreatedDateTime)
                    .FirstOrDefaultAsync();

                if (order == null)
                {
                    break; //exit out of the loop
                }

                order.StatusID = (int)Statuses.InProgress;
                order.UserID = userID;
                order.AssignedDateTime = DateTime.UtcNow;
                try
                {
                    await _dbContext.SaveChangesAsync();
                    i = maxTry;
                }
                catch (DbUpdateConcurrencyException ex)
                {
                    // since mutiple users are compting for orders. We may get concurrency issue
                    // in such case retry to get next order                    
                    await _dbContext.Entry(order).ReloadAsync();
                    order = null;                        
                }
            }    

        return order;

    }
有没有办法在不将整个记录集加载到内存的情况下选择随机记录?

请看。请看。
        public async Task<WorkOrder> GetNextOrder(int userID)
        {
            var maxTry = 3;            

            WorkOrder order = null;
            using (var transaction = await _dbContext.Database.BeginTransactionAsync())
            {
                for (int i = 0; i < maxTry; i++)
                {
                    order = await _dbContext.WorkOrder
                    .Where(o => o.UserID == null)
                        .OrderBy(o => o.CreatedDateTime)
                        .FirstOrDefaultAsync();

                    if (order == null)
                    {
                        break; //exit out of the loop
                    }

                    order.StatusID = (int)Statuses.InProgress;
                    order.UserID = userID;
                    order.AssignedDateTime = DateTime.UtcNow;
                    try
                    {
                        await _dbContext.SaveChangesAsync();
                        i = maxTry;
                    }
                    catch (DbUpdateConcurrencyException ex)
                    {
                        // since mutiple users are compting for orders. We may get concurrency issue
                        // in such case retry to get next order                    
                        await _dbContext.Entry(order).ReloadAsync();
                        order = null;                        
                    }
                }

                transaction.Commit();
            }
            return order;

        }
 order = await _dbContext.WorkOrder
                    .Where(o => o.UserID == null)
                    .OrderBy(o => o.CreatedDateTime)
                    .TakeRandonRecord() ??