对象'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
成功。