Для каждой петли LINQ Вставка дает мне Невозможно добавить сущность, которая уже существует - PullRequest
2 голосов
/ 11 марта 2010

У меня есть следующий код, который в моей голове должен создать новую строку в таблице:

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 () вне каждого для каждого, и он просто вставляет последнюю строку.

Есть мысли?

Ответы [ 4 ]

3 голосов
/ 11 марта 2010

Вы не создаете новый bLog в вашем цикле.На каждой итерации вы просто изменяете данные одной записи.

Попробуйте использовать ключевое слово new, чтобы создать новый экземпляр bLog, прежде чем назначать ему данные в цикле ForEach

1 голос
/ 11 марта 2010

Еще одна вещь о коде:

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 (для * это наоборот) 1045 *).

  3. Наконец, почему вы объявили fin вне цикла, когда вы используете его только внутри? Всегда старайтесь поместить объявление ближе к его первому использованию. Как следствие, это означает, что вы должны всегда инициализировать значение сразу.

    Поэтому удалите объявление 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 в объявлении выше, потому что из контекста ясно, что fin должно быть Boolean, и компилятор правильно выводит это.

0 голосов
/ 11 марта 2010

откуда берется экземпляр блога? Похоже, он создан вне цикла. Поэтому на каждом проходе вы изменяете экземпляр блога, а не добавляете новый. Как только первый сохранен, у него есть идентификатор, и вы не можете снова вызывать InsertOnSubmit. Вы должны создавать новый экземпляр того, что bLog есть в каждой итерации.

Как только вы исправите это, вы должны звонить только SubmitChanges вне цикла

0 голосов
/ 11 марта 2010

Вы должны определенно обновиться bLog внутри цикла For Each.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...