关于c#:代码优先迁移:如何设置新属性的默认值?

Code-first migration: How to set default value for new property?

我使用EF6在数据库中存储report类的实例。数据库已包含数据。假设我想在report中添加一个属性,

1
2
3
4
5
6
public class report {
    // ... some previous properties

    // ... new property:
    public string newProperty{ get; set; }
}

现在,如果我转到包管理器控制台并执行

1
2
add-migration Report-added-newProperty
update-database

我将在'/migrations'文件夹中得到一个文件,将newProperty列添加到表中。这个很好用。但是,在数据库中较旧的条目上,newProperty的值现在是空字符串。但我希望它是,例如,"老的"。

所以我的问题是:如何在迁移脚本(或其他地方)中为新属性(任何类型)设置默认值?


如果您看到生成的迁移代码,您将看到AddColumn

1
AddColumn("dbo.report","newProperty", c => c.String(nullable: false));

您可以添加EDOCX1[1]

1
2
AddColumn("dbo.report","newProperty",
           c => c.String(nullable: false, defaultValue:"old"));

或增加defaultValueSql

1
2
AddColumn("dbo.report","newProperty",
           c => c.String(nullable: false, defaultValueSql:"GETDATE()"));


您必须更改迁移脚本中添加如下属性/列的行:

1
AddColumn("dbo.reports","newProperty", c => c.String(nullable: false, defaultValue:"test"));


希望它能帮助别人。将以前的答案中的所有内容放在一起(例如使用布尔属性):

1)向实体添加新属性。

1
2
3
4
/// <summary>
/// Determines if user is enabled or not. Default value is true
/// </summary>
public bool IsEnabled { get; set; }

2)运行下面的命令以添加迁移中的新更改。

1
add-migration addIsEnabledColumn

3)从上面的命令创建迁移文件,打开该文件。

enter image description here

4)设置默认值。

1
2
3
4
public override void Up()
    {
        AddColumn("dbo.AspNetUsers","IsEnabled", c => c.Boolean(nullable: false, defaultValue: true));
    }

我发现仅仅在实体属性上使用自动属性初始值设定项就足以完成任务。

例如:

1
2
3
public class Thing {
    public bool IsBigThing { get; set; } = false;
}