添加int属性,EF不断使其成为可空列?

时间:2015-07-17 00:28:01

标签: c# .net entity-framework entity-framework-6

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

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

}

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

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

4 个答案:

答案 0 :(得分:1)

从SQL Server开始:

如果您只是从SQL Server管理工作室用户界面插入该列,则这是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

列内容为0

===关于EF

当然,行为取决于您使用的EF提供程序(我猜SQL Server)。

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

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

这种行为来自哪里? EF或EF提供商?

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

因此,如果指定“默认”,则可以省略“必需”。

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

对于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.x是不可能的......

答案 1 :(得分:1)

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

答案 2 :(得分:0)

  1. 打开您的实体框架图
  2. 找到您的课程并将其删除
  3. 再次将类添加到实体框架
  4. 我有同样的问题,这对我有用。

答案 3 :(得分:-1)

你有两个问题:

  1. 如何将列/属性添加到现有数据集中?
  2. 如何使列非空?
  3. 第二个我认为是Required

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

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