Ошибка Entity Framework при обновлении: поле обязательно для заполнения - PullRequest
0 голосов
/ 03 февраля 2020

Я использую EF 6.2.0, Code First from Database, в среде. net 4.5.2. У меня есть этот DbSet:

<Table("Firebird.PLANT4")>
Partial Public Class PLANT4
  <Key>
  <DatabaseGenerated(DatabaseGeneratedOption.None)>
  Public Property ID_PLANT4 As Integer

  Public Property STATUS As Integer

  <Required>
  <StringLength(20)>
  Public Property DESCRIPTION1 As String

  Public Property COUNTER As Long

  Public Property RESET_COUNTER As Integer
End Class

Когда я выполняю этот код:

Using dbContext As New DbModel
  dbContext.Database.Connection.ConnectionString = GetFbConnectionString()
  dbContext.Database.Connection.Open()

  Dim plant As PLANT4 = dbContext.PLANT4.Find(1)
  plant.RESET_COUNTER = 1
  dbContext.SaveChanges()
End Using

Я получаю сообщение об ошибке: «Поле DESCRIPTION1 обязательно для заполнения». Исключением является выбрасывание во время SaveChanges. Я не могу понять, в чем проблема, как будто я наблюдаю «завод» в отладке, там есть все поля (ID_PLANT4 = 1 - существующая строка), и, в частности, DESCRIPTION1 - это не «Ничто».

Я могу просто удалите атрибут «Обязательный», и он работает, но этот атрибут является следствием того, что столбец db не допускает нулевые значения, поэтому я не думаю, что это правильный путь к go.

Я могу даже добавьте эту строку кода сразу после выражения «Using»:

dbContext.Configuration.ValidateOnSaveEnabled = False

, и это работает, но опять же я не думаю, что это правильный путь к go.

В чем причина такого поведения?

1 Ответ

0 голосов
/ 06 февраля 2020

В конце концов я обнаружил, что проблема заключается в следующем: поле DESCRIPTION1 заполняется по умолчанию 20 пробелами. Это не нуль, но это строка, образованная только пробелами. По неизвестной причине во время проверки эта строка обрабатывается EF как null, и генерируется исключение, потому что это обязательное поле.

Атрибут «Required» не требуется, но я генерирую свои классы POCO с помощью «Code» «Сначала из базы данных», поэтому, если поле VARCHAR объявлено как «не нулевое», оно автоматически генерируется с атрибутом «Обязательный». Теперь я думаю, что лучше использовать пустые значения для столбцов VARCHAR.

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