C# ALTER TABLE DROP列失败,因为一个或多个对象访问此列
我正在尝试这样做:C# ALTER TABLE DROP列失败,因为一个或多个对象访问此列,c#,sql,sql-server,code-first,C#,Sql,Sql Server,Code First,我正在尝试这样做: ALTER TABLE CompanyTransactions DROP COLUMN Created 但我明白了: Msg 5074,16级,状态1,第2行 对象“DF__CompanyTr__create__0CDAE408”依赖于列“Created”。 味精4922,第16级,第9状态,第2行 创建ALTER TABLE DROP列失败,因为一个或多个对象访问此列 这是一个代码优先表。不知何故,迁移过程变得一团糟,我正试图手动回滚一些更改 我不知道这是什么: DF__
ALTER TABLE CompanyTransactions DROP COLUMN Created
但我明白了:
Msg 5074,16级,状态1,第2行
对象“DF__CompanyTr__create__0CDAE408”依赖于列“Created”。
味精4922,第16级,第9状态,第2行
创建ALTER TABLE DROP列失败,因为一个或多个对象访问此列
这是一个代码优先表。不知何故,迁移过程变得一团糟,我正试图手动回滚一些更改
我不知道这是什么:
DF__CompanyTr__Creat__0CDAE408
在删除列之前,必须先从列中删除
约束
。您引用的名称是一个默认约束
e、 g
@SqlZim的答案是正确的,但只是为了解释为什么会发生这种情况。我也遇到过类似的问题,这是由非常无辜的事情引起的:向列添加默认值
ALTER TABLE MySchema.MyTable ADD
MyColumn int DEFAULT NULL;
但在MS SQL Server领域中,列上的默认值是一个约束。和每个约束一样,它也有一个标识符。如果在约束中使用列,则不能删除该列
因此,实际上可以避免此类问题的方法是始终为默认约束指定一个显式名称,例如:
ALTER TABLE MySchema.MyTable ADD
MyColumn int NULL,
CONSTRAINT DF_MyTable_MyColumn DEFAULT NULL FOR MyColumn;
在删除列之前,您仍然需要删除约束,但您至少可以预先知道它的名称,正如您需要删除与要删除的所有列相关的约束(由sql自动创建)的答案中所述 执行以下步骤来完成所需的工作
exec sp\u helpconstraint'
altertable
drop constraint
(仅此格式或类似格式)Alter table Drop column column1、column2
等)删除一列或多列更改列
数据类型
时,需要更改每个数据库的约束键
alter table CompanyTransactions drop constraint [df__CompanyTr__Creat__0cdae408];
您需要做几件事:
除了公认的答案外,如果您正在使用实体迁移更新数据库,您应该在迁移文件中
Up()
函数的开头添加这一行:
Sql("alter table dbo.CompanyTransactions drop constraint [df__CompanyTr__Creat__0cdae408];");
您可以在nuget数据包管理器控制台的错误中找到约束名称,该错误以
FK_dbo开头。
我也遇到了同样的问题,这是为我编写的脚本,该脚本使用了一个由两部分组成的名称,名称之间用句点“.”分隔
使用[数据库名称]
去
更改表[TableNamePart1]。[TableNamePart2]删除约束[DF_u_;TableNamePart1D__;ColumnName__5; AEE82B9]
去
更改表[TableNamePart1]。[TableNamePart1]删除列[ColumnName]
GO我需要用Guid替换INT主键。经过几次失败的尝试,下面的EF代码对我有效。如果未设置默认值。。。您最终得到一个Guid作为现有记录的键
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropUniqueConstraint("PK_Payments", "Payments");
migrationBuilder.DropColumn(
name: "PaymentId",
table: "Payments");
migrationBuilder.AddColumn<Guid>(
name: "PaymentId",
table: "Payments",
type: "uniqueidentifier",
defaultValueSql: "NewId()",
nullable: false);
}
protected override void Up(MigrationBuilder MigrationBuilder)
{
migrationBuilder.DropUniqueConstraint(“PK_付款”、“付款”);
migrationBuilder.DropColumn(
名称:“PaymentId”,
表:“付款”);
migrationBuilder.AddColumn(
名称:“PaymentId”,
表:“付款”,
类型:“唯一标识符”,
defaultValueSql:“NewId()”,
可为空:false);
}
Entity Framework没有为我们解决这一问题,这令人沮丧。@chakeda我同意我也有类似的情况。问题是,我的应用程序部署到许多机器上,所有自动生成的约束都有不同的名称。如何处理这种情况?将从information_schema生成sql的长脚本添加到迁移中感觉不是一个干净而好的选择。@MantasDaškevičius最好的选择是命名约束,而不是使用自动生成的名称。要添加到@malloc4k的答案中……您可以展开sql Server 2016中的“Constraints”文件夹,它将显示“默认”约束名称。它没有那么简单。在更高的环境中,您将无法查看实际的约束名称。@user2513019别忘了向上投票它帮助了您:)
Sql("alter table dbo.CompanyTransactions drop constraint [df__CompanyTr__Creat__0cdae408];");
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropUniqueConstraint("PK_Payments", "Payments");
migrationBuilder.DropColumn(
name: "PaymentId",
table: "Payments");
migrationBuilder.AddColumn<Guid>(
name: "PaymentId",
table: "Payments",
type: "uniqueidentifier",
defaultValueSql: "NewId()",
nullable: false);
}