添加int属性后,EF使其成为可空列

本文关键字:属性 int EF 添加 | 更新日期: 2023-09-27 18:03:03

我正在添加一个名为Order的int属性到已经在DB表中有记录的现有实体。

public class Page : Content
{
    // ...
    public int Order { get; set; }
    // ...
}

然而,当我运行"update-database"时,它将列添加为可空值,默认值为null。我尝试使用[DefaultValue(0)],以及在构造函数中设置默认值。既不工作。

如何将列/属性添加到现有的数据集,并将其填充为0的非空值?谢谢。

添加int属性后,EF使其成为可空列

从SQL Server开始:

如果您只是从SQL Server management studio用户界面插入列,这是DDL:

ALTER TABLE dbo.MyTable ADD
    [Order] int NULL;
ALTER TABLE dbo.MyTable ADD CONSTRAINT
    DF_MyTable_Order DEFAULT 0 FOR [Order];

列内容为空。如果指定该列不应为空,则这是DDL

ALTER TABLE dbo.MyTable ADD
    [Order] int NOT NULL CONSTRAINT DF_MyTable_Order DEFAULT 0

并按预期工作(column content = 0)

手动运行此查询

ALTER TABLE dbo.MyTable ADD
    [Order] int CONSTRAINT DF_MyTable_Order DEFAULT 0

列内容为空

最后手动运行此查询

ALTER TABLE dbo.MyTable ADD
    [Order] int CONSTRAINT DF_MyTable_Order DEFAULT 0 WITH VALUES

列内容为0

===关于EF

当然,行为取决于你正在使用的EF提供程序(我想是SQL Server)。

奇怪的是,SQL Server 2014 (SQL Server的EF提供程序对每个SQL Server版本都有不同的支持)是,如果您指定默认的WITHOUT Required属性EF提供程序将列生成为不可空的,字段创建查询是

ALTER TABLE [dbo].[MyTable] ADD [Order] [int] NOT NULL DEFAULT 0

这种行为是从哪里来的?EF或EF供应商?

调试提供程序,似乎是EF断言列不应该为空(只指定Default)。

所以,如果你指定了Default,你可以省略Required。

但是现在,为什么在你的情况下不起作用?
我认为你的迁移有问题。

对于make may测试,我添加了这一列

    [DefaultValue(0)]
    public int Order { get; set; }

我使用这个迁移配置(所有东西都是自动的,所以很多人认为——我也是——这对生产环境不好)

Database.SetInitializer(new MigrateDatabaseToLatestVersion<BloggingContext, BloggingContextMigrationConfiguration>(true));

internal sealed class BloggingContextMigrationConfiguration : DbMigrationsConfiguration<BloggingContext>
{
    public BloggingContextMigrationConfiguration()
    {
        AutomaticMigrationsEnabled = true;
        AutomaticMigrationDataLossAllowed = true;
    }
}

===另一个结果

实际上我找不到一个方法来生成这样的东西

ALTER TABLE dbo.MyTable ADD
    [Order] int CONSTRAINT DF_MyTable_Order DEFAULT 0 WITH VALUES

和我认为EF 6。

这是因为继承。并不是派生类型中的所有属性都可以定义为不可空的,因为层次结构上层的类型没有这些属性。

  1. 打开实体框架图
  2. 找到你的类并删除它
  3. 再次添加类到实体框架

我有同样的问题,这对我来说是有效的。

你有两个问题:

  1. 如何向现有数据集添加列/属性?
  2. 如何使列非空?

第二个我认为是Required

[Required]
public int Order { get; set; }

第一个问题——我不知道如何表达