在LINQ中,删除辅助表中所有记录的正确方法是什么?

时间:2015-03-18 20:16:34

标签: vb.net linq entity-framework

VS2013,VB,EF,LINQ

这些是我班级定义的相关部分:

Partial Public Class ApplicationDbContext
  Public Property ChannelItems As DbSet(Of ChannelItem)
  Public Property UserPosts As DbSet(Of UserPost)
End Class

Public Class ChannelItem
  Public Property ChannelItemID As Integer
  Public Property Anchor As New UserPost
  Public Property Comments As New List(Of UserPost)
  Public Property SpecialPermissionReq As Boolean
End Class

Public Class UserPost
  Public Property UserPostID As Integer
  ...
  Public Property MarkedAsAnswerBy As New List(Of MarkedAsAnswerBy)
End Class

Public Class MarkedAsAnswerBy
  Public Property MarkedAsAnswerByID As Integer
  Public Property UserName As String
End Class

在开发过程中,我当然将记录填入MarkedAsAnswerBy。请注意,目前,MarkedAsAnswerBy未声明为单独的DbSet()。通过ChannelItem / UserPost导航满足当前需求。

但是在迁移过程中的“更新数据库”期间,种子方法引发了错误,因为我在重建之前删除了UserPost DbSet()记录。 SQL被冒犯了,因为辅助表具有到UserPost记录的活动链接;很有道理。所以我添加了以下内容以清除密钥连接:

Dim listofUserPost = context1.UserPosts.Include(Function(x) x.MarkedAsAnswerBy).ToList()
For Each item In listofUserPost
  item.MarkedAsAnswerBy.RemoveAll(Function(x) x.MarkedAnsweredByID >= 0)
Next

种子方法然后运行良好,这很好。但我注意到我的代码只将MarkedAsAnswerBy中的Key字段更改为Null。我现在明白为什么,这就是带谓词的RemoveAll。

我实际上无法在For Each循环中删除MarkedAsAnswerBy中的记录,因为通过在枚举中删除记录来修改集合的限制。但我想删除记录而不是将它们留在表中。

如果没有为MarkedAsAnswerBy声明DbSet(),我可以做什么?

1 个答案:

答案 0 :(得分:1)

如果您使用For i = last to 0 Step - 1,那么您可以在删除时迭代集合,因为索引会下降并且不会比集合大。

对于辅助表,您需要使用DbSet并查询并删除与Id匹配的那些。