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

Jor*_*Axe 155 sql database sql-server entity-framework entity-framework-4

基本上我在我的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; }
Run Code Online (Sandbox Code Playgroud)

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

对象'DF_ Movies _Rating__48CFD27E'取决于列'评级'.ALTER TABLE ALTER COLUMN评级失败,因为一个或多个对象访问此列.

有什么问题?

Joe*_*ras 236

试试这个:

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

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

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

你的桌子的树

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

  • @ManirajSS:ALTER TABLE yourtable DROP CONSTRAINT DF_Movies_Rating__48CFD27E (38认同)
  • 触发创建约束的是什么?我有一堆,我真的不想要它们! (18认同)
  • 嗯,如果我想使用我的框架(Laravel)和dropColumn的数据库迁移,该怎么办?我不知道如何删除具有神秘名称的约束,由SQL服务器自动生成:( (5认同)
  • 我确定:我删除了它,文件夹 Constraints 变空了,当我运行应用程序或调用 `update-database` 时,它会再次重新创建自己,我发布了这个问题:http://stackoverflow.com/questions/40267769/实体框架中数据类型更改后的依赖项错误 (2认同)
  • 为什么SQLServer不会隐式删除约束?毕竟,它确实是隐式创建的! (2认同)

Lui*_*uot 44

这就是tsql方法

 ALTER TABLE yourtable DROP CONSTRAINT constraint_name     -- DF_Movies_Rating__48CFD27E
Run Code Online (Sandbox Code Playgroud)

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


小智 42

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

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

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

CREATE TABLE Movie (
    ...
    rating INT NOT NULL default 100
)
Run Code Online (Sandbox Code Playgroud)

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

如果您改为创建它

CREATE TABLE Movie (
  name VARCHAR(255) NOT NULL,
  rating INT NOT NULL CONSTRAINT rating_default DEFAULT 100
);
Run Code Online (Sandbox Code Playgroud)

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

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;
Run Code Online (Sandbox Code Playgroud)

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


Sla*_*nov 20

由于约束具有不可预测的名称,您可以编写特殊脚本(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));    
}
Run Code Online (Sandbox Code Playgroud)


Jin*_*alu 8

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

对象'DF __*'依赖于列''.

删除依赖于该列的约束:

ALTER TABLE TableName DROP CONSTRAINT dependent_constraint;
Run Code Online (Sandbox Code Playgroud)

例:

Msg 5074,Level 16,State 1,Line 1

对象' DF__Employees__Colf__1273C1CD'依赖于列'Colf'.

Msg 4922,Level 16,State 9,Line 1

ALTER TABLE DROP COLUMN Colf失败,因为一个或多个对象访问此列.

Drop Constraint(DF__Employees__Colf__1273C1CD):

ALTER TABLE Employees DROP CONSTRAINT DF__Employees__Colf__1273C1CD;
Run Code Online (Sandbox Code Playgroud)

然后你可以删除列:

Alter Table TableName Drop column ColumnName
Run Code Online (Sandbox Code Playgroud)


AZ_*_*AZ_ 5

MS SQL Studio会在您删除列时进行处理,但是如果您需要以编程方式删除约束,这里提供的是简单的解决方案

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

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__')
Run Code Online (Sandbox Code Playgroud)

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

奖励:这是删除外键和其他类型约束的代码。

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
Run Code Online (Sandbox Code Playgroud)

博客