EF 6:添加具有默认值的新属性不起作用[重复]
Posted
技术标签:
【中文标题】EF 6:添加具有默认值的新属性不起作用[重复]【英文标题】:EF 6: adding a new property with a default value does not work [duplicate] 【发布时间】:2021-01-20 05:00:48 【问题描述】:使用 Entity Framework 6 和代码优先,我有一个像这样的现有实体类:
public class UserAccount
public int Id get; set;
public string Username get; set;
到目前为止,一切都很好。几个帐户已成功插入数据库。现在,基于新的需求,我想添加一个“long”类型的新字段,默认值为“0”。所以它必须是不可为空的。直到今天,我还在想“这就是数据注释的用途!”。所以我在课堂上添加了这个:
[Required]
[DefaultValue(0)]
public long Number get; set; = 0;
启用自动迁移后,我启动应用程序并立即收到异常消息:“'UserAccount' 上的属性 'Number' 无法设置为 'null' 值”。通过 SQL Server Management Studio 调查数据库后,问题很明显:EF 自动创建了一个 nullable “bigint” 列,没有默认值。
在其他实体上,[Required] 或 [MaxLength()] 等属性可以正常工作。
为什么在这种情况下 EF 会忽略我的数据注释?添加具有默认值的新属性/列的正确方法是什么?
【问题讨论】:
【参考方案1】:尝试将属性添加为可为空:
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 更改为您的表名
在此之后,如果您不需要可以为空的列,请删除符号“?”长类型属性并再次运行
【讨论】:
这是一个非 EF 解决方案,需要手动与数据库交互;这是不切实际的。我的问题是如何使用 EF 实现我的要求。向现有数据库添加不可为空的列不会那么难吧? @Cleo 我认为这是一个解决方案,因为限制它在 c# 程序中,而不是在 DB 中,当指定“必需”时,如果数据为空,程序会抛出异常,所以你可以在 DB 中有一个可为空的列,并且限制在 EntityFramework 上以上是关于EF 6:添加具有默认值的新属性不起作用[重复]的主要内容,如果未能解决你的问题,请参考以下文章