如何从迁移脚本中删除默认约束

时间:2019-12-24 13:37:10

标签: c# entity-framework entity-framework-core

我有一个迁移脚本,我想从列中删除默认值,请帮忙

 migrationBuilder.AddColumn<bool>(
              name: "IsExternalLink",
              table: "Link",
              nullable: false,
              defaultValue: 0);

我要更改列并删除默认值。

我试图像这样更改列:

  migrationBuilder.AlterColumn<bool>(
                  name: "IsExternalLink",
                  table: "Link");

但这不会删除默认值

4 个答案:

答案 0 :(得分:1)

您需要设置nullable: true

migrationBuilder.AddColumn<bool>(
          name: "IsExternalLink",
          table: "Link",
          nullable: true);

这意味着您的列不能有任何值。

答案 1 :(得分:1)

如果您想删除列的 DEFAULT 值,您必须定义 oldDefaultValue

// drop default
migrationBuilder.AlterColumn<bool>(
                name: "col",
                table: "my_table",
                oldDefaultValue: true, <-- THIS must be defined!
                defaultValue: null);

// Resulting Query: ALTER TABLE my_table ALTER COLUMN col DROP DEFAULT

还要确保 <type>name (..) 也是正确的,因为如果您的书面 AlterColumn 声明,EfCore 不会抱怨任何事情很垃圾。


此外,如果您的表已经包含行并且您想添加一个没有 DEFAULT 的新列,请执行以下操作:

// add column WITH default for existing rows
migrationBuilder.AddColumn<bool>(
                name: "col",
                table: "my_table",
                type: "boolean",
                nullable: false,
                defaultValue: true);

// drop default for new entries
migrationBuilder.AlterColumn<bool>(
                name: "col",
                table: "my_table",
                oldDefaultValue: true,
                defaultValue: null);

答案 2 :(得分:0)

布尔是值类型,您需要为其指定一个值,除非您像@StepUp提​​到的那样创建可空布尔值。您可以阅读更多关于here

的值类型

但是,如果您希望IsExternal的默认值与零不同,则可以在POCO类中进行设置

public boolean IsExternalLink{ get; set; } = true; // To wahtever default value you choose

答案 3 :(得分:0)

您问题中的代码应导致删除默认约束。您确定它仍然存在吗?可能需要查看将这种迁移应用于数据库时生成的SQL。

进行以下迁移:

migrationBuilder.AddColumn<bool>(
    name: "MyColumn",
    table: "MyTable",
    nullable: false,
    defaultValue: true);

migrationBuilder.AlterColumn<bool>(
    name: "MyColumn",
    table: "MyTable",
    nullable: false,
    defaultValue: null);

应用迁移时会生成以下SQL:

ALTER TABLE [MyTable] ADD [MyColumn] bit NOT NULL DEFAULT CAST(1 AS bit);

DECLARE @var0 sysname;
      SELECT @var0 = [d].[name]
      FROM [sys].[default_constraints] [d]
      INNER JOIN [sys].[columns] [c] ON [d].[parent_column_id] = [c].[column_id] AND [d].[parent_object_id] = [c].[object_id]
      WHERE ([d].[parent_object_id] = OBJECT_ID(N'[MyTable]') AND [c].[name] = N'MyColumn');
      IF @var0 IS NOT NULL EXEC(N'ALTER TABLE [MyTable] DROP CONSTRAINT [' + @var0 + '];');
      ALTER TABLE [MyTable] ALTER COLUMN [MyColumn] bit NOT NULL;

自从this issue被修复以来,应该在每次调用AlterColumn时都删除默认约束。您会注意到,大多数迁移SQL负责确定MyColumn字段的名称并删除默认约束。