实体查询未正确更新

时间:2011-04-09 15:39:52

标签: asp.net vb.net entity-framework entity-framework-4 linq-to-entities

我有以下代码:

  ' 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(),它会中断。想法?

1 个答案:

答案 0 :(得分:1)

这是一个明显的问题。您正在向数据库询问没有占用者的记录并分配新的占用者,但不保存更改,而是在循环中执行此操作,因此查询必须始终返回相同的行。

只有在assignments枚举查询结果时才会发生异常。如果您想避免该异常,只需在查询上调用ToList即可。

我仍然会考虑算法,并尝试提前加载床。这需要一个查询来获取分配,每个床需要一个查询+一个更新。如果您的受助人返回1.000行,则必须对床位进行1.000查询。您不会避免1.000更新,因为EF不支持命令批处理。关于什么是你的算法中的交易还有一些决定。是单床的更新还是处理所有加载的assignments?根据这个决定,你也可以考虑你的算法。

顺便说一下。如果assignments是一个查询,它很可能很可能被重写为一些床的连接,所以你不需要循环子查询。