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:添加具有默认值的新属性不起作用[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用scala数据框添加具有以下行值的新列[重复]

从字典中添加具有映射值的新熊猫列[重复]

添加具有 nil 值的新动态属性

Spark和Scala,通过映射公用键添加具有来自另一个数据帧的值的新列[重复]

如何更改表以添加具有当前日期默认值的新列日期?

唯一属性不起作用 mongoose 重复项仍在添加中