我有一个迁移脚本,我想从列中删除默认值,请帮忙
migrationBuilder.AddColumn<bool>(
name: "IsExternalLink",
table: "Link",
nullable: false,
defaultValue: 0);
我要更改列并删除默认值。
我试图像这样更改列:
migrationBuilder.AlterColumn<bool>(
name: "IsExternalLink",
table: "Link");
但这不会删除默认值
答案 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
字段的名称并删除默认约束。