2017-06-23 6 views
2

にありますので、新しいトランザクションは許可されていない)画像
に、私は、関数QuickSaveを持っているように、それはエラーになります()を呼び出すと、最初にデータを保存してからコンテキストを変更し、コンテキストを保存しようとします。私が文脈を保存しているとき、私はエラーを超えています。私にとっては、ストアドプロシージャを呼び出した後でコンテキストを保存することが重要です。ここでエラー:私はDb.SaveAsyncを(使用してコンテキスト保存しようとしていたときにセッションで実行されている他のスレッドは、C#

Description of the problem

私のコードです:。)あなたは、通常の方法を使用してdb.Asyncを(使用している

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; 
} 
+0

'StoryTaskCount'からのレコードは、反復して読み込まれます。 'SaveChanges'を呼び出すと、トランザクションが作成されます(複数のステートメントを送る必要があります)が、進行中の読み取りを妨げます。最初の行セット全体( 'ToList')を読むか、別のコンテキストインスタンスの変更を行います(ただし、変更検出のためにはエンティティインスタンスをコンテキストに追加する必要があります)。 – Richard

答えて

2
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; 
    } 

ので、)(あなたのAPIも非同期してくださいしてみてください。このコード。運のベスト。

+1

ここでの主なポイントは、apiは非同期ですが、 'StoryTaskCount'は' IQueryable'ではなく、結果のマテリアライズドリストを返すようになったことです。 – Evk

関連する問題