基本上我在我的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 回答
解决方案:
打开数据库表 - >展开表 - >展开约束并看到这一点
试试这个:
在更改字段类型之前删除约束DF_Movies_Rating__48CFD27E .
约束通常由DBMS(SQL Server)自动创建 .
要查看与表关联的约束,请展开 Object explorer 中的表属性,然后展开类别约束,如下所示:
您必须在更改字段类型之前删除约束 .
这是
tsql
方式为了完整起见,这只是将@Joe Taras的评论作为答案
我将此作为响应添加来解释约束的来源 . 我试着在评论中这样做,但很难在那里很好地编辑: - /
如果您创建(或更改)具有默认值的列的表,它将为您创建约束 .
例如,在您的表中,它可能是:
它将为默认值100创建约束 .
如果您改为创建它
然后你会得到一个很好命名的约束,当你改变所述表时,它更容易引用 .
您可以组合最后两个语句,以便更改列并在一行中命名约束(如果它是现有的表,则必须)
由于约束具有不可预测的名称,您可以编写特殊脚本(DropConstraint)来删除它而不知道它的名称(在EF 6.1.3中测试过):
当我们尝试删除依赖的列时,我们会看到这种错误:
删除依赖于该列的约束:
Example:
Drop Constraint(DF__Employees__Colf__1273C1CD):
Then you can Drop Column:
MS SQL Studio会在您删除列时进行处理,但如果您需要 Delete Constraint Programmatically 这里是简单的解决方案
这是一个代码片段,它将删除具有默认约束的列:
只需将 TableName 和 ColumnName 替换为适当的值即可 . 即使该列已被删除,您也可以安全地运行它 .
Bonus :这是删除外键和其他类型约束的代码 .
Blog
尝试运行迁移以解决此问题时出现此错误我重命名了该列并使用重新生成了迁移
在包管理器控制台中 . 然后我就能跑了
成功 .