EF 6:添加具有默认值的新属性不起作用

问题描述

使用代码优先的Entity Framework 6,我有一个这样的现有实体类

public class UserAccount
{
    public int Id { get; set; }
    public string Username { get; set; }
}

到目前为止,太好了。几个帐户已成功插入数据库中。现在,根据新的要求,我想添加一个认值为“ 0”的“ long”类型的新字段。因此它必须是不可为空的。直到今天,我还以为“这就是数据注释的目的!”。所以我将其添加到了班级:

    [required]
    [DefaultValue(0)]
    public long Number { get; set; } = 0;

启用自动迁移后,我启动了应用程序,并立即收到异常消息:“'UserAccount'上的'Number'属性不能设置为'null'值”。通过sql Server Management Studio调查数据库后,问题很明显:EF自动创建了一个没有认值的 nullable “ bigint”列。

在其他实体上,[required]或[MaxLength()]之类的属性也可以正常工作。

在这种情况下,为什么EF会忽略我的数据注释?添加具有认值的新属性/列的正确方法是什么?

解决方法

尝试将属性添加为可空值:

public class UserAccount
{
    public int Id { get; set; }
    public string Username { get; set; }

    [Required]
    [DefaultValue(0)]
    public long? Number { get; set; } = 0; 
}

如果未指定,则数据库需要一个用于现有寄存器的值。

然后运行该应用程序。在数据库上,直接使用sql脚本将默认值分配给现有寄存器:

UPDATE {mytable} set Number=0 WHERE Number IS NULL;

将{mytable}更改为您的表名

在此之后,如果不需要为空的列,请删除符号“?”类型的属性,然后再次运行