我将名为Order的int属性添加到已在DB表中有记录的现有实体。
public class Page : Content
{
// ...
public int Order { get; set; }
// ...
}
但是,当我运行" update-database"时,它将列添加为可空,默认值为null。我尝试使用[DefaultValue(0)],以及在构造函数中设置默认值。都没有工作。
如何将列/属性添加到现有数据集并将其填充为非空值0?感谢。
答案 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)
我有同样的问题,这对我有用。
答案 3 :(得分:-1)
你有两个问题:
第二个我认为是Required
[Required]
public int Order { get; set; }
第一个问题 - 我不知道如何表达它。