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(),我可以做什么?
答案 0 :(得分:1)
如果您使用For i = last to 0 Step - 1
,那么您可以在删除时迭代集合,因为索引会下降并且不会比集合大。
对于辅助表,您需要使用DbSet
并查询并删除与Id匹配的那些。