实体框架中一个或多个实体的可空布尔属性验证失败

Posted

技术标签:

【中文标题】实体框架中一个或多个实体的可空布尔属性验证失败【英文标题】:Validation failed for one or more entities in Entity Framework for nullable boolean property 【发布时间】:2019-01-15 07:49:46 【问题描述】:

我的班级看起来像这样,我添加了可以为空的新属性IsModified。我可以只使用 Name 和 Key 属性创建一个 A 类型的新实体,但是当我尝试更新数据库中 IsModified 为空的任何现有记录的键时,我从 Entity Framework 收到此错误:

System.Data.Entity.Validation.DbEntityValidationException。在 context.SaveChangesAsync() 上需要 IsModified 字段。

模型类:

public class A

    public long ID  get; set; 
    public string Key  get; set; 
    public bool? IsModified  get; set; 
    public string Name  get; set; 

    public A()
    
        this.IsModified = false;
    

SQL Server 表:

CREATE TABLE [dbo].[A]
(
    [ID] [bigint] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](max) NOT NULL,
    [Key] [nvarchar](max) NOT NULL,
    [IsModified] [bit] NULL,
 )

我正在使用具有代码优先方法的实体框架 v6。 [IsModified] 可以为空,所以我不确定为什么仍然需要该字段。

【问题讨论】:

【参考方案1】:

这里的问题是布尔值不能配置为空。 EF 始终认为它是必需的。我将 IsModified bit null 更改为 IsModified bit not null default 1 。并使用迁移将现有记录更新为默认值。 参考 - https://docs.microsoft.com/en-us/ef/core/modeling/required-optional。

【讨论】:

【参考方案2】:

您如何迁移?清除表 dbo.__MigrationHistory。我经常在使用 EF 时遇到类似的问题,并且在大多数情况下清理此表会有所帮助。 (肯定能用,我在电脑里重现了这种情况)

【讨论】:

以上是关于实体框架中一个或多个实体的可空布尔属性验证失败的主要内容,如果未能解决你的问题,请参考以下文章

一个或多个实体的验证失败。有关更多详细信息,请参阅“EntityValidationErrors”属性[重复]

一个或多个实体的验证失败。有关详细信息,请参阅“EntityValidationErrors”属性

对一个或多个实体的验证失败。有关详细信息,请参见“EntityValidationErrors”属性。

对一个或多个实体的验证失败。有关详细信息,请参见“EntityValidationErrors”属性。

“未处理DbEntityValidationException”,"对一个或多个实体的验证失败。有关详细信息,请参见“EntityValidationErrors”属性"。

实体框架中的可空实体投影