C# 添加int属性时,EF是否一直使其为空列?
我正在将一个名为Order的int属性添加到数据库表中已有记录的现有实体中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?谢谢。您有两个
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的属性。