我在.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
并且它有效,但是我也不认为这是正确的方法。
此行为的原因是什么?
最终,我发现问题是:默认情况下,字段DESCRIPTION1填充了20个空格。它不为null,而是仅由空格组成的字符串。出于未知原因,在验证期间,此字符串被EF视为null,并且由于它是必填字段而引发异常。
“ Required”属性不是必需的,但是我是通过“来自数据库的代码优先”生成我的POCO类的,因此,如果将VARCHAR字段声明为“ not null”,它将使用“ Required”属性自动生成。现在,我认为最好为VARCHAR列允许使用空值。