在我的控制器操作中,我试图从数据库中检索记录:
Dim surveyDB = db.Surveys.Find(sid)
sid 在Class级别实例化:
Private sid As New Integer
当我第一次创建一个新的Survey(如果surveyDB没有)时,我将它添加到数据库并设置 sid ,如下所示:
db.Surveys.Add(survey)
Await db.SaveChangesAsync()
sid = survey.SurveyID
这似乎还不错(比如新的调查进入第20行所以调查.SurveyID = 20),除非我回到那个页面, sid 因某些原因而被重置所以surveyDB总是没有。
为什么在ASP.NET中类级变量会被重置?如何才能正确找到我正在寻找的记录?
答案 0 :(得分:0)
之后的代码是依赖于上述行结果的IF:
当你有await时,这实际上应该是自动的(据我所知),当一个表达式试图使用它应该挂起的值,直到await结束。在尝试类似下面的解决方案之前,这一点非常重要。
否则...
一种选择是等待它完成(或任何数目完成):
Dim surveyDB = db.Surveys.FindAsync(sid)
Task.WhenAll(surveyDB)
If IsNothing(surveyDB.Result) Then
//...
Else
//...
End If
这将允许您添加任意数量的异步调用:
Dim surveyDB = db.Surveys.FindAsync(sid)
Dim surveyDB1 = db.Surveys.FindAsync(sid1)
Dim surveyDB2 = db.Surveys.FindAsync(sid2)
Task.WhenAll(surveyDB, surveyDB1, survyeDB2)
If IsNothing(surveyDB.Result) Then
//...
Else
//...
End If
答案 1 :(得分:0)
我通过使用Session变量而不是Class变量并首先检查它的值来解决这个问题,如果它不存在则使用实体状态更新行:
If Session("sid") Is Nothing Then
db.Surveys.Add(survey)
Await db.SaveChangesAsync()
Session("sid") = survey.SurveyID
Else
db.Entry(survey).State = EntityState.Modified
Await db.SaveChangesAsync()
End If