基本上,我在我的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; }

它工作得很好,但当我改变评级的int为双精度时,我在更新数据库时得到以下错误:

对象'DF_Movies_Rating__48CFD27E'依赖于列'Rating'。 由于有一个或多个对象访问该列,导致该列评级失败。

有什么问题吗?


当前回答

解决方案:

打开数据库表->扩展表->扩展约束并看到此

其他回答

试试这个:

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

约束通常是由DBMS (SQL Server)自动创建的。

要查看与表相关的约束,在对象资源管理器中展开表属性,然后是类别Constraints,如下所示:

在更改字段类型之前,必须删除约束。

由于约束有不可预知的名字,你可以写一个特殊的脚本(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));    
}

当我们试图删除一个依赖的列时,我们会看到这样的错误:

对象“DF__*”依赖于列”。

删除依赖于该列的约束:

ALTER TABLE TableName DROP CONSTRAINT dependent_constraint;

例子:

编号5074,16层,状态1,1线 对象'DF__Employees__Colf__1273C1CD'依赖于列'Colf'。 编号4922,16层,9号州,1号线 ALTER TABLE DROP COLUMN Colf失败,因为有一个或多个对象访问该列。

删除约束(DF__Employees__Colf__1273C1CD):

ALTER TABLE Employees DROP CONSTRAINT DF__Employees__Colf__1273C1CD;

然后你可以删除列:

Alter Table TableName Drop column ColumnName

当从多个表中删除列时,我遇到了以下默认约束错误。如果需要更改列的数据类型,也会出现类似的问题。

对象“DF_TableName_ColumnName”依赖于列“ColumnName”。

为了解决这个问题,我必须首先使用以下查询删除所有这些约束

DECLARE @sql NVARCHAR(max)=''     
SELECT @SQL += 'Alter table ' + Quotename(tbl.name) + '  DROP constraint ' + Quotename(cons.name) + ';'
 FROM SYS.DEFAULT_CONSTRAINTS cons 
 JOIN   SYS.COLUMNS col ON col.default_object_id = cons.object_id
 JOIN   SYS.TABLES tbl ON tbl.object_id = col.object_id
 WHERE  col.[name] IN ('Column1','Column2')

--PRINT @sql
EXEC Sp_executesql @sql 

在那之后,我删除了所有这些列(我的要求,在这个问题中没有提到)

DECLARE @sql NVARCHAR(max)='' 
SELECT @SQL += 'Alter table ' + Quotename(table_catalog)+ '.' + Quotename(table_schema) + '.'+ Quotename(TABLE_NAME) 
               + '  DROP column ' + Quotename(column_name) + ';'
FROM   information_schema.columns where COLUMN_NAME IN ('Column1','Column2')  
--PRINT @sql
EXEC Sp_executesql @sql 

我张贴在这里,以防有人发现同样的问题。

编码快乐!

这是tsql方法

 ALTER TABLE yourtable DROP CONSTRAINT constraint_name     -- DF_Movies_Rating__48CFD27E

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