Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.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
C# 错误:不允许新事务,因为c中的会话中正在运行其他线程_C#_.net - Fatal编程技术网

C# 错误:不允许新事务,因为c中的会话中正在运行其他线程

C# 错误:不允许新事务,因为c中的会话中正在运行其他线程,c#,.net,C#,.net,当我尝试使用Db.SaveAsync保存上下文时,它将给出类似于图像中的错误 我有一个函数QuickSave in loop,它首先调用和保存数据,然后修改上下文并尝试保存上下文。当我保存上下文时,我得到了上面的错误。对我来说,在调用存储过程之后保存上下文是很重要的 这是我的密码: var items = StoryTaskCount(item.ProjectId, storyList); //var st = items.FirstOrDefault(); foreach(var st i

当我尝试使用Db.SaveAsync保存上下文时,它将给出类似于图像中的错误 我有一个函数QuickSave in loop,它首先调用和保存数据,然后修改上下文并尝试保存上下文。当我保存上下文时,我得到了上面的错误。对我来说,在调用存储过程之后保存上下文是很重要的

这是我的密码:

var items = StoryTaskCount(item.ProjectId, storyList);

//var st = items.FirstOrDefault();

foreach(var st in items) {
    var story = await Factory.StoryService.StoryByIdAsync(item.ProjectId, st.Id);
    if (st.Count == 0) {
        taskItem = await Factory.TaskService.QuickSave(item.ProjectId, story.StoryId, "Task for " + ConstantCompany.Prefix.StoryCode + story.StoryCode, true);
        story.TaskId = taskItem.TaskId;
    }
    story.TaskCount = st.Count;
}

public IQueryable < BSTChildVM > StoryTaskCount(decimal projectId, string ids) {
    var res = (from story in Factory.StoryService.ForProject(projectId) 
                join st in Factory.BusinessHelperService.GetIds(ids) on story.StoryId equals st
                join task in Factory.TaskService.AllTasks(projectId) on story.StoryId equals task.StoryId 
                into ftask from task in ftask.DefaultIfEmpty() 
                group task by story.StoryId into taskGroup select new BSTChildVM 
                {
                    Id = taskGroup.Key,
                    Count = (from item in taskGroup where item.TaskId != null select item).Count()
                }
            );
    return res;
}

您正在使用普通方法并使用db.Async。因此,请使您的api也异步。请尝试此代码。祝您好运。

在迭代时读取StoryStaskCount中的记录。当您调用SaveChanges创建事务时,需要发送多条语句,但这会干扰正在进行的读取。要么首先读取整个行集合,要么在不同的上下文实例上进行更改,但您需要将实体实例附加到上下文以进行更改检测。这里的要点不是api是异步的,而是StoryTaskCount现在返回结果的物化列表,而不是IQueryable。
var items = await StoryTaskCount(item.ProjectId, storyList);

       //var st = items.FirstOrDefault();
        foreach (var st in items)
        {
            var story = await Factory.StoryService.StoryByIdAsync(item.ProjectId, st.Id);
            if (st.Count == 0)
            {
                taskItem = await Factory.TaskService.QuickSave(item.ProjectId, story.StoryId, "Task for " + ConstantCompany.Prefix.StoryCode + story.StoryCode, true);
                story.TaskId = taskItem.TaskId;
            }
            story.TaskCount = st.Count;
        }
public async Task<List<BSTChildVM>> StoryTaskCount(decimal projectId, string ids)
    {
        var res = await (from story in Factory.StoryService.ForProject(projectId)
                         join st in Factory.BusinessHelperService.GetIds(ids) on story.StoryId equals st
                         join task in Factory.TaskService.AllTasks(projectId) on story.StoryId equals task.StoryId into ftask
                         from task in ftask.DefaultIfEmpty()
                         group task by story.StoryId into taskGroup
                         select new BSTChildVM
                         {
                             Id = taskGroup.Key,
                             Count = (from item in taskGroup
                                      where item.TaskId != null
                                      select item).Count()
                         }).ToListAsync();
        return res;
    }