更新期间发生实体框架错误:必填字段

问题描述 投票:0回答:1

我在.net 4.5.2环境中使用的是EF 6.2.0,数据库的代码优先。我有这个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期间抛出异常。我不明白问题出在哪里,就好像我在调试中观看“ plant”一样,所有字段都在那里(ID_PLANT4 = 1是现有行),特别是DESCRIPTION1并非没有。

我可以简单地删除“ Required”属性,它可以工作,但是该属性是db列不允许使用空值的结果,所以我认为这不是正确的方法。

我什至可以在“使用”语句之后添加以下代码行:

dbContext.Configuration.ValidateOnSaveEnabled = False

并且它有效,但是我也不认为这是正确的方法。

此行为的原因是什么?

entity-framework entity-framework-6 ef-code-first
1个回答
0
投票

最终,我发现问题是:默认情况下,字段DESCRIPTION1填充了20个空格。它不为null,而是仅由空格组成的字符串。出于未知原因,在验证期间,此字符串被EF视为null,并且由于它是必填字段而引发异常。

“ Required”属性不是必需的,但是我是通过“来自数据库的代码优先”生成我的POCO类的,因此,如果将VARCHAR字段声明为“ not null”,它将使用“ Required”属性自动生成。现在,我认为最好为VARCHAR列允许使用空值。

© www.soinside.com 2019 - 2024. All rights reserved.