0

我有以下代码:实体查询不更新对于每个正确

' 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() 

在该段我通过当前分配迭代和当床未被占用(= O)和室内等于给当前学生,我把学生插入那个房间。

问题是update_occupancy似乎总是保持不变。例如,我可能有四张病床(ID 101,102,103,104),第一次应该将学生分配到101,将下一个学生分配到102,将下一个学生分配到103,等等。但它只是一遍又一遍地覆盖第一个。我不能在For Each中放置一个dbContext.SaveChanges(),它会中断。思考?

+1

“我不能把一个dbContext.SaveChanges()放在For Each中,它打破了”< - 这是什么意思?你得到一个例外,哪一个? – Slauma 2011-04-09 16:07:40

+0

我这样做,但我已经把它放在Try/Catch中,它仍然只是覆盖! – davemackey 2011-04-09 16:09:12

+1

什么是例外?放置在Try/Catch块没有帮助,它只隐藏了错误,并没有解决它。 – Slauma 2011-04-09 16:12:25

回答

1

这是一个明显的问题。您要求您的数据库记录没有占有者的记录并分配新占有者,但不保存更改,因此查询必须始终返回同一行。

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

不过我会考虑算法,并尝试加载床前。这需要一个查询来获得每个床位的分配和一个查询+一个更新。如果您的分配机构返回1.000行,您将不得不对1000张床进行查询。您不会避免1.000更新,因为EF不支持命令批处理。关于您的算法中的交易也有所不同。是单床的更新还是处理所有加载的assignments?基于这个决定,你也可以考虑你的算法。

Btw。如果assignments是一个查询,它可能最有可能被重写为与床连接,因此您不需要在循环中进行子查询。