代码之家  ›  专栏  ›  技术社区  ›  LiamGu

对于每个循环,linq insert giving me不能添加已经存在的实体

  •  2
  • LiamGu  · 技术社区  · 14 年前

    我有以下代码,在我的头脑中应该在表中创建一个新行:

    Dim fin As Boolean
    Dim db2 As New ChecklistModeldbmlDataContext
    For Each a In bServers
    
       If collection("fin" & a.ServerName) = "true, false" Or collection("fin" & a.ServerName) = "true,false" Then
           fin = True
       Else
           fin = False
       End If
    
       bLog.AMLogID = amLog.LogID
       bLog.ByteCount = collection("bytes" & a.ServerName)
       bLog.DurationHours = collection("hours" & a.ServerName)
       bLog.DurationMinutes = collection("minutes" & a.ServerName)
       bLog.DurationSeconds = collection("seconds" & a.ServerName)
       bLog.IsFinished = fin
       bLog.ServerID = a.ServerID
       bLog.DetailsAndErrors = collection("details" & a.ServerName)
    
       db2.BackupLogs.InsertOnSubmit(bLog)
       db2.SubmitChanges()
    Next
    

    它只将一条记录添加到表中,然后出错,无法添加已存在的实体。

    现在,它应该在表中输入4行,但我不明白为什么上面会给出这个错误。

    我还尝试将db2.submitchanges()放在for-each之外,它只插入最后一行。

    有什么想法吗?

    4 回复  |  直到 12 年前
        1
  •  3
  •   Kirschstein    14 年前

    你不会在循环中创建新的博客。在每次迭代中,您只是修改单个记录的数据。

    尝试使用 new 关键字在foreach循环中将数据分配给blog之前创建一个新的blog实例

        2
  •  1
  •   Konrad Rudolph    14 年前

    关于代码的另一件事:

    If collection("fin" & a.ServerName) = "true, false" Or collection("fin" & a.ServerName) = "true,false" Then
       fin = True
    Else
       fin = False
    End If
    

    这个代码有几个问题。

    1. 首先, 唐纳德 写这样的 If 设置布尔变量的条件。情况已经发生了 所需的值。相反,直接写:

      fin = collection("fin" & a.ServerName) = "true, false" Or _
            collection("fin" & a.ServerName) = "true,false"
      

      这是真的 一般来说 . 所以每当你有这样的代码:

      If condition Then
          value = True
      Else
          value = False
      End If
      

      重写为 value = condition . 总是 . 也不例外。或者,如果这些值是反向的,则分配被求反的结果,即 value = Not condition .

    2. 其次, 从未 使用 And Or 在布尔条件下。这些是 位运算 在布尔条件下它们是无意义的。当然,他们得出了正确的结果,但这是相当巧合的。

      正确的解决方案是使用 AndAlso OrElse 加入条件。在您的情况下,这将是:

      fin = collection("fin" & a.ServerName) = "true, false" OrElse _
            collection("fin" & a.ServerName) = "true,false"
      

      这不仅逻辑性更强,而且效率更高,因为只有在必要时才对条件的第二部分进行评估,即当条件的第一部分尚未评估为 True (与之相反 而且 )

    3. 最后,你为什么要申报 fin 当你只在圈外使用它时?始终尝试将声明放在最接近其第一次使用的位置。因此,这意味着你应该 总是 立即初始化值。

      所以删除 从循环前开始并更正内部分配:

      Dim fin As Boolean = collection("fin" & a.ServerName) = "true, false" OrElse _
                           collection("fin" & a.ServerName) = "true,false"
      

      如果您已经正确设置了Visual Studio,那么vb项目选项 Option Explicit ,请 Option Strict Option Infer 都是 On (你 应该 做这个!)你甚至可以忽略 As Boolean 在上述声明中,因为从上下文来看,很明显 必须是 Boolean 编译器正确地推断了这一点。

        3
  •  0
  •   Klaus Byskov Pedersen    14 年前

    你肯定是新来的 bLog 里面 For Each 循环。

        4
  •  0
  •   Mike Two    14 年前

    博客整合实例来自哪里?它看起来像是在循环之外创建的。因此,在每次传递时,您都要修改blog实例,而不是添加新实例。第一个文件保存后,它就有一个ID,您不能在上面再次调用InsertonSubmit。您应该为每个迭代中的任何博客创建一个新实例。

    一旦你修好了,你应该只打电话给 SubmitChanges 在环路外