我有以下代码:
' Now retabulate the current occupancy.
For Each row In assignments
Try
Dim assignment As Integer = row.room
Dim student_id As String = row.id
Dim update_occupancy = (From p In dbContext.Beds _
Where p.occupant = 0 _
Where p.room = assignment _
Select p).FirstOrDefault
update_occupancy.occupant = student_id
Catch ex As Exception
End Try
Next
dbContext.SaveChanges()
在这个片段中,我正在迭代当前的作业,当床没有被占用(= 0)并且房间等于当前学生时,我将学生插入那个房间。
问题是update_occupancy似乎始终保持不变。例如,我可能有四张床(ID 101,102,103,104),第一次将学生分配到101,下一个学生分配到102,下一个学生分配到103,依此类推。但它只是一遍又一遍地覆盖第一个。我不能在For Each中放入dbContext.SaveChanges(),它会中断。想法?
答案 0 :(得分:1)
这是一个明显的问题。您正在向数据库询问没有占用者的记录并分配新的占用者,但不保存更改,而是在循环中执行此操作,因此查询必须始终返回相同的行。
只有在assignments
枚举查询结果时才会发生异常。如果您想避免该异常,只需在查询上调用ToList即可。
我仍然会考虑算法,并尝试提前加载床。这需要一个查询来获取分配,每个床需要一个查询+一个更新。如果您的受助人返回1.000行,则必须对床位进行1.000查询。您不会避免1.000更新,因为EF不支持命令批处理。关于什么是你的算法中的交易还有一些决定。是单床的更新还是处理所有加载的assignments
?根据这个决定,你也可以考虑你的算法。
顺便说一下。如果assignments
是一个查询,它很可能很可能被重写为一些床的连接,所以你不需要循环子查询。