首页 文章

对象'DF__*'依赖于列'*' - 将int更改为double

提问于
浏览
137

基本上我在我的EF数据库中有一个表,它具有以下属性:

public int Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public string Image { get; set; }
public string WatchUrl { get; set; }
public int Year { get; set; }
public string Source { get; set; }
public int Duration { get; set; }
public int Rating { get; set; }
public virtual ICollection<Category> Categories { get; set; }

它工作正常但是当我将Rating的int更改为double时,我在更新数据库时遇到以下错误:

The object 'DF_Movies_Rating__48CFD27E' is dependent on column 'Rating'. ALTER TABLE ALTER COLUMN Rating failed because one or more objects access this column.

有什么问题?

8 回答

  • 39

    解决方案:

    打开数据库表 - >展开表 - >展开约束并看到这一点

    screenshot

  • 221

    试试这个:

    在更改字段类型之前删除约束DF_Movies_Rating__48CFD27E .

    约束通常由DBMS(SQL Server)自动创建 .

    要查看与表关联的约束,请展开 Object explorer 中的表属性,然后展开类别约束,如下所示:

    Tree of your table

    您必须在更改字段类型之前删除约束 .

  • 6

    这是 tsql 方式

    ALTER TABLE yourtable DROP CONSTRAINT constraint_name     -- DF_Movies_Rating__48CFD27E
    

    为了完整起见,这只是将@Joe Taras的评论作为答案

  • 1

    我将此作为响应添加来解释约束的来源 . 我试着在评论中这样做,但很难在那里很好地编辑: - /

    如果您创建(或更改)具有默认值的列的表,它将为您创建约束 .

    例如,在您的表中,它可能是:

    CREATE TABLE Movie (
        ...
        rating INT NOT NULL default 100
    )
    

    它将为默认值100创建约束 .

    如果您改为创建它

    CREATE TABLE Movie (
      name VARCHAR(255) NOT NULL,
      rating INT NOT NULL CONSTRAINT rating_default DEFAULT 100
    );
    

    然后你会得到一个很好命名的约束,当你改变所述表时,它更容易引用 .

    ALTER TABLE Movie DROP CONSTRAINT rating_default;
    ALTER TABLE Movie ALTER COLUMN rating DECIMAL(2) NOT NULL;
    -- sets up a new default constraint with easy to remember name
    ALTER TABLE Movie ADD CONSTRAINT rating_default DEFAULT ((1.0)) FOR rating;
    

    您可以组合最后两个语句,以便更改列并在一行中命名约束(如果它是现有的表,则必须)

  • -2

    由于约束具有不可预测的名称,您可以编写特殊脚本(DropConstraint)来删除它而不知道它的名称(在EF 6.1.3中测试过):

    public override void Up()
    {    
        DropConstraint();
        AlterColumn("dbo.MyTable", "Rating", c => c.Double(nullable: false));
    }
    
    private void DropConstraint()
    {
        Sql(@"DECLARE @var0 nvarchar(128)
              SELECT @var0 = name
              FROM sys.default_constraints
              WHERE parent_object_id = object_id(N'dbo.MyTable')
              AND col_name(parent_object_id, parent_column_id) = 'Rating';
              IF @var0 IS NOT NULL
                  EXECUTE('ALTER TABLE [dbo].[MyTable] DROP CONSTRAINT [' + @var0 + ']')");
    }
    
    public override void Down()
    {            
        AlterColumn("dbo.MyTable", "Rating", c => c.Int(nullable: false));    
    }
    
  • 1

    当我们尝试删除依赖的列时,我们会看到这种错误:

    对象'DF __ *'取决于列'' .

    删除依赖于该列的约束:

    ALTER TABLE TableName DROP CONSTRAINT dependent_constraint;
    

    Example:

    消息5074,级别16,状态1,行1对象'DF__Employees__Colf__1273C1CD'取决于列'Colf' . 消息4922,级别16,状态9,行1 ALTER TABLE DROP COLUMN Colf失败,因为一个或多个对象访问此列 .

    Drop Constraint(DF__Employees__Colf__1273C1CD):

    ALTER TABLE Employees DROP CONSTRAINT DF__Employees__Colf__1273C1CD;
    

    Then you can Drop Column:

    Alter Table TableName Drop column ColumnName
    
  • 18

    MS SQL Studio会在您删除列时进行处理,但如果您需要 Delete Constraint Programmatically 这里是简单的解决方案

    这是一个代码片段,它将删除具有默认约束的列:

    DECLARE @ConstraintName nvarchar(200)
    SELECT @ConstraintName = Name FROM SYS.DEFAULT_CONSTRAINTS WHERE PARENT_OBJECT_ID = OBJECT_ID('__TableName__') AND PARENT_COLUMN_ID = (SELECT column_id FROM sys.columns WHERE NAME = N'__ColumnName__' AND object_id = OBJECT_ID(N'__TableName__'))
    IF @ConstraintName IS NOT NULL
    EXEC('ALTER TABLE __TableName__ DROP CONSTRAINT ' + @ConstraintName)
    IF EXISTS (SELECT * FROM syscolumns WHERE id=object_id('__TableName__') AND name='__ColumnName__')
    EXEC('ALTER TABLE __TableName__ DROP COLUMN __ColumnName__')
    

    只需将 TableNameColumnName 替换为适当的值即可 . 即使该列已被删除,您也可以安全地运行它 .

    Bonus :这是删除外键和其他类型约束的代码 .

    IF EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE where TABLE_NAME = '__TableName__' AND COLUMN_NAME = '__ColumnName__')
    BEGIN
    SELECT @ConstraintName = CONSTRAINT_NAME FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE where TABLE_NAME = '__TableName__' AND COLUMN_NAME = '__ColumnName__'
    EXEC('ALTER TABLE __TableName__ DROP CONSTRAINT ' + @ConstraintName)
    END
    

    Blog

  • 35

    尝试运行迁移以解决此问题时出现此错误我重命名了该列并使用重新生成了迁移

    add-migration migrationname -force
    

    在包管理器控制台中 . 然后我就能跑了

    update-database
    

    成功 .

相关问题