Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ALTER TABLE DROP列失败,因为一个或多个对象访问此列_C#_Sql_Sql Server_Code First - Fatal编程技术网

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自动创建)的答案中所述

执行以下步骤来完成所需的工作

  • 使用系统存储过程实用程序sp\u helpconstraint获取所有约束的名称-执行以下
    exec sp\u helpconstraint'
  • 一旦您得到约束的名称,然后复制该约束名称并执行下一条语句,即
    altertable
    drop constraint
    (仅此格式或类似格式)
  • 删除约束后,可以使用常规方法(即
    Alter table Drop column column1、column2
    等)删除一列或多列

  • 更改列
    数据类型
    时,需要更改每个数据库的
    约束键

      alter table CompanyTransactions drop constraint [df__CompanyTr__Creat__0cdae408];
    

    您需要做几件事:

  • 首先需要检查约束是否存在于信息模式中
  • 然后需要通过连接sys.default\u约束和sys.columns进行查询 如果列和默认_约束具有相同的对象ID
  • 当您在步骤2中加入时,您将从默认的_约束中获得约束名称。你放弃这个限制。这是我做的一个这样的滴的例子

  • 除了公认的答案外,如果您正在使用实体迁移更新数据库,您应该在迁移文件中
    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);
    }