问题描述
使用代码优先的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}更改为您的表名
在此之后,如果不需要为空的列,请删除符号“?”类型的属性,然后再次运行