Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 添加int属性时,EF是否一直使其为空列?_C#_.net_Entity Framework_Entity Framework 6 - Fatal编程技术网

C# 添加int属性时,EF是否一直使其为空列?

C# 添加int属性时,EF是否一直使其为空列?,c#,.net,entity-framework,entity-framework-6,C#,.net,Entity Framework,Entity Framework 6,我正在将一个名为Order的int属性添加到数据库表中已有记录的现有实体中 public class Page : Content { // ... public int Order { get; set; } // ... } 但是,当我运行“更新数据库”时,它会将该列添加为可为null的列,默认值为null。我尝试使用[DefaultValue(0)],并在构造函数中设置默认值。两者都不起作用 如何将列/属性添加到现有数据集中,并将其填充为非空值0?谢谢。您有两个

我正在将一个名为Order的int属性添加到数据库表中已有记录的现有实体中

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

}
但是,当我运行“更新数据库”时,它会将该列添加为可为null的列,默认值为null。我尝试使用[DefaultValue(0)],并在构造函数中设置默认值。两者都不起作用


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

您有两个问题:

  • 如何将列/属性添加到现有数据集
  • 如何使列非空
  • 第二个我认为是
    必需的

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

    第一个问题--我不知道如何表达它。

    从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];
    
    列内容为空。 如果指定列不应为null,则这是DDL

    ALTER TABLE dbo.MyTable ADD
        [Order] int NOT NULL CONSTRAINT DF_MyTable_Order DEFAULT 0
    
    并按预期工作(列内容=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
    
    列内容为空

    最后手动运行此查询

    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 Provider对每个SQL Server版本都有不同的支持)是,如果指定默认值而不指定必需的属性,EF Provider会将列生成为不可为null,并且字段创建查询为空

    ALTER TABLE [dbo].[MyTable] ADD [Order] [int] NOT NULL DEFAULT 0
    
    这种行为从何而来?EF还是EF提供商

    调试提供程序似乎是EF断言列不应为null(仅指定默认值)

    所以,如果指定Default,则可以省略Required

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

    对于make-may测试,我添加了这个专栏

        [DefaultValue(0)]
        public int Order { get; set; }
    
    我使用这种迁移配置(很多人认为所有东西都是自动的——我也是——这对生产没有好处)

    我认为EF6.x是不可能做到的

  • 打开实体框架图
  • 找到你的类并删除它
  • 将类再次添加到实体框架

  • 我也有同样的问题,这对我很有效。

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

    不必重复不能注释的内容。那会给人留下坏印象。另外,不要在列表中使用代码块。我们可以看到顺序在哪里使用吗?目前它在任何地方都没有使用。我只是把它当作一种财产。我有第二个int属性,它没有任何特殊属性或初始化,但该属性在DB中创建为NOTNULL。但是,在我开始添加内容之前就已经存在了。这是否意味着在派生类型上保留字段不可为空是可以的,因为EF将使字段在引擎盖下仍然可以为空?这很好,这样派生类型上的所有字段都不必是可为null的属性。