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

基本上我有一个在我的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_ 电影 _Rating__48CFD27E”依赖于“评级”列。 ALTER TABLE ALTER COLUMN评级失败,因为一个或多个对象访问此列。

什么问题?

尝试这个:

在更改字段types之前删除约束DF_Movies_Rating__48CFD27E

约束通常由DBMS(SQL Server)自动创build。

要查看与表关联的约束,请在对象资源pipe理器中展开表格属性,然后展开类别约束 ,如下所示:

你的桌子的树

您必须在更改字段types之前删除约束。

这是tsql方式

  ALTER TABLE yourtable DROP CONSTRAINT constraint_name -- DF_Movies_Rating__48CFD27E 

为了完整,这只是表示@Joe Taras的评论作为答案

我添加这个作为回应来解释约束来自何处。 我试图在评论中做到这一点,但很难在那里很好地编辑: – /

如果您使用具有默认值的列创build(或更改)表,则会为您创build约束。

在你的表格中,例如可能是:

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

它将创build默认约束100。

如果你反而像这样创build它

 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中testing过):

 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”列。

Msg 4922,Level 16,State 9,Line 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 

解答:

打开数据库表 – >展开表 – >展开约束,看看这个

截图

我有这个错误尝试运行迁移来解决它我重命名列,并重新生成使用迁移

 add-migration migrationname -force 

在包pipe理器控制台中。 那时我才能跑

 update-database 

成功。