代码优先迁移:如何为新属性设置默认值?

Elu*_*FTW 37 .net c# entity-framework ef-migrations entity-framework-6

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

public class report {
    // ... some previous properties

    // ... new property:
    public string newProperty{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

add-migration Report-added-newProperty
update-database
Run Code Online (Sandbox Code Playgroud)

我将在'/ Migrations'文件夹中获取一个文件,newProperty向表中添加一列.这很好用.但是,对于数据库中较旧的条目,该值newProperty现在为空字符串.但我希望它是,例如,"老".

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

Ham*_*jam 63

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

AddColumn("dbo.report", "newProperty", c => c.String(nullable: false));
Run Code Online (Sandbox Code Playgroud)

你可以加 defaultValue

AddColumn("dbo.report", "newProperty", 
           c => c.String(nullable: false, defaultValue: "old"));
Run Code Online (Sandbox Code Playgroud)

或者添加 defaultValueSql

AddColumn("dbo.report", "newProperty",
           c => c.String(nullable: false, defaultValueSql: "GETDATE()"));
Run Code Online (Sandbox Code Playgroud)

  • 如果它正确地拉入代码第一模型中定义的[DefaultValue(xyz)]属性,那将会很好.而不是每次添加迁移时都必须记住哪些列需要什么; 必须对生成的文件进行后期编辑,然后针对该更改的文件正常运行Update-Database.我想知道是否有可能超越这种愚蠢的行为......我无法相信没有人改进这一点.当然,我并不是唯一一个对此默认的AspNet Identity模型感到沮丧的人...... LockoutEnabled,EmailConfirmed,AccessFailedCount.所有硬编码,所有问题 (8认同)
  • 这似乎不适用于 MySQL-EF。'defaultValue' 不设置该值,并且 'defaultValueSql' 会创建一个异常(“blob 文本几何图形或 json 列不能有默认值”)......剩下的唯一解决方法是使用原始 SQL。:( (3认同)
  • 如何添加其他列的默认值,例如:我希望新属性默认值是report.OldProperty? (2认同)

Vic*_* LG 12

希望它可以帮助某人。将先前答案中的所有内容放在一起(使用布尔属性的示例)

1) 向实体添加新属性。

/// <summary>
/// Determines if user is enabled or not. Default value is true
/// </summary>
public bool IsEnabled { get; set; }
Run Code Online (Sandbox Code Playgroud)

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

add-migration addIsEnabledColumn
Run Code Online (Sandbox Code Playgroud)

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

在此处输入图片说明

4) 设置默认值。

public override void Up()
{
        AddColumn(
            "dbo.AspNetUsers", 
            "IsEnabled", 
            c => c.Boolean(
                nullable: false, 
                defaultValue: true
            )
        );
}
Run Code Online (Sandbox Code Playgroud)

  • 5) 在步骤 4 之后运行 Update-Database,以通过更改来更新实际数据库。添加这一点只是为了新手。 (4认同)

ngu*_*ngu 6

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

AddColumn("dbo.reports", "newProperty", c => c.String(nullable: false, defaultValue: "test"));
Run Code Online (Sandbox Code Playgroud)