C# 将新的必填字段添加到EF代码首次迁移的表之一

C# 将新的必填字段添加到EF代码首次迁移的表之一,c#,entity-framework,ef-code-first,entity-framework-migrations,C#,Entity Framework,Ef Code First,Entity Framework Migrations,我使用EF代码进行第一次迁移。我已经有很多关于生产数据库的数据,我想引入一个不可为空的字段。怎么可能呢 当前它抛出一个错误: The column cannot contain null values. [ Column name = Test,Table name = 'MyTable'] 我通常使用的策略是首先将新列作为可选列引入,填充它,然后使其成为必需列。实际上,您可以通过对每个步骤进行单独的迁移来执行单独的迁移步骤,或者手动更改自动生成的迁移代码,以便在一次迁移中完成所有更改。我将

我使用EF代码进行第一次迁移。我已经有很多关于生产数据库的数据,我想引入一个不可为空的字段。怎么可能呢

当前它抛出一个错误:

The column cannot contain null values. [ Column name = Test,Table name = 'MyTable'] 

我通常使用的策略是首先将新列作为可选列引入,填充它,然后使其成为必需列。实际上,您可以通过对每个步骤进行单独的迁移来执行单独的迁移步骤,或者手动更改自动生成的迁移代码,以便在一次迁移中完成所有更改。我将描述如何使用单个迁移

如果添加新的
[Required]
字段,自动生成的迁移可能如下所示,如果
dbo.MyTable
中包含数据,则迁移将失败:

public override void Up()
{            
    AddColumn("dbo.MyTable", "MyColumn", c => c.String(nullable: false));
}

public override void Down()
{
    DropColumn("dbo.MyTable", "MyColumn");
}
您可以编辑迁移,以最初将列添加为可选,预填充它,然后将其标记为必需。您可以使用
Sql()
执行预填充。根据您的数据,您可能希望基于其他列或甚至其他表来计算新列的值,您可以通过编写适当的SQL来实现这一点

public override void Up()
{
    AddColumn("dbo.MyTable", "MyColumn", c => c.String());
    Sql("UPDATE dbo.MyTable SET MyColumn = COALESCE(SomeOtherColumn, 'My Fallback Value')");
    AlterColumn("dbo.MyTable", "MyColumn", c => c.String(nullable: false));
}

public override void Down()
{
    DropColumn("dbo.MyTable", "MyColumn");
}
如果您只想在所有行上设置相同的值,可以跳过
Sql()
步骤,在删除
defaultValue
之前,根据需要使用
defaultValue
添加列。这允许您在迁移期间将所有行设置为相同的值,同时在添加新行时仍需要手动指定该值。据推测,这种方法在EF的旧版本上不起作用。我不确定需要哪个版本的EF,但它至少应该在现代版本上工作(≥6.2):


定义默认值。如何为所有其他现有记录定义此新必填字段的默认值?类似于
AddColumn(“dbo.Blogs”,“Rating”,c=>c.Int(null:false,defaultValue:3))Up
方法中的code>应该可以做到这一点。这是因为运气不好,它仍然抛出相同的错误,可能是重复的
public override void Up()
{
    AddColumn("dbo.MyTable", "MyColumn", c => c.String(defaultValue: "Some Value", nullable: false));
    AlterColumn("dbo.MyTable", "MyColumn", c => c.String(nullable: false));
}

public override void Down()
{
    DropColumn("dbo.MyTable", "MyColumn");
}