MVC - ALTER TABLE DROP COLUMN 失败,因为一个或多个对象访问此列
Posted
技术标签:
【中文标题】MVC - ALTER TABLE DROP COLUMN 失败,因为一个或多个对象访问此列【英文标题】:MVC - ALTER TABLE DROP COLUMN failed because one or more objects access this column 【发布时间】:2019-08-11 02:51:22 【问题描述】:尝试删除对类的引用时,我从包管理器控制台收到以下错误消息:
对象“FK_dbo.Resultats_dbo.Ovelses_OvelseId”依赖于列“OvelseId”。 ALTER TABLE DROP COLUMN OvelseId 失败,因为一个或多个对象访问此列。
对我的模型进行以下更改时遇到此问题
public class Resultater
public int Id get; set;
[Required]
public string AspNetUsersId get; set; //foreign key for users
//public Ovelser Ovelse get; set;
//[Required]
//public int OvelseId get; set;
[Required]
[Display(Name = "Dato")]
public DateTime Date get; set;
[Required]
public string Form get; set;
public class Ovelser
public int Id get; set;
[Required]
[Display(Name = "Øvelse")]
public OvelseType OvelseType get; set;
[Required]
public short OvelseTypeId get; set;
[Required]
public decimal Resultat get; set;
[Required]
[Display(Name = "Hvordan var utførelsen")]
public string Beskrivelse get; set;
包管理器控制台在我开始迁移时为我提供以下代码:
public override void Up()
DropForeignKey("dbo.Resultaters", "OvelseId", "dbo.Ovelsers");
DropIndex("dbo.Resultaters", new[] "OvelseId" );
DropColumn("dbo.Resultaters", "OvelseId");
public override void Down()
AddColumn("dbo.Resultaters", "OvelseId", c => c.Int(nullable: false));
CreateIndex("dbo.Resultaters", "OvelseId");
AddForeignKey("dbo.Resultaters", "OvelseId", "dbo.Ovelsers", "Id", cascadeDelete: true);
我发现了一个非常相似的问题“ALTER TABLE DROP COLUMN failed because one or more objects access this column”但我无法应用它。
【问题讨论】:
奇怪的问题!您的Resultater
是否通过Ovelse_Id
与另一个课程相关联?
我将重新制作错误消息和提交,因为我已经删除了“OvelseId”
为什么您无法应用类似问题的答案?
我不知道我是怎么做“丢弃约束”的,因为智能感知没有注意到它......
@TanvirArjel 是的,Resultater 与“Ovelse_Id”相关,因为当我之前删除 OvelseId 时,它是创建的(在您提出上一个问题后发现)(我编辑了我的问题,因为它现在是我的全部改变)
【参考方案1】:
我正在查看 DropForeignKey()。还有另一个版本允许您指定外键的名称。您也许可以将其添加到您的迁移中。 Microsoft document on DropForeignKey
DropForeignKey("dbo.Resultaters", "FK_dbo.Resultats_dbo.Ovelses_OvelseId");
【讨论】:
我可以用这个删除,但是我想在Ovelser
public override void Up() CreateIndex("dbo.Ovelsers", "ResultaterId"); DropForeignKey("dbo.Resultaters", "FK_dbo.Ovelsers_dbo.Resultaters_ResultaterId");
中添加外键我从包管理器控制台收到以下错误...The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "FK_dbo.Ovelsers_dbo.Resultaters_ResultaterId". The conflict occurred in database "aspnet-Kast-20190310120456", table "dbo.Resultaters", column 'Id'.
这看起来很奇怪。如果您要向 Ovelser 添加外键,则 up() 方法应该看起来更像您在原始问题中发布的 down() 方法,但表名已切换。该错误消息使它看起来好像 Ovelser 表中已经有一个外键 ResultaterId。
天哪..救了我的夜伴,非常感谢,干杯。维护遗留软件是一场噩梦,不要这样做,lmao!【参考方案2】:
在 SQL Server Management Studio 中尝试此操作,然后进行迁移。
use [Name Of Your Database];
alter table Resultater drop constraint [FK_dbo.Resultats_dbo.Ovelses_OvelseId];
【讨论】:
您需要在一个可以让您直接访问数据库的程序中实现它,例如 Sql Server Management Studio。选择“New Query”并将use [Name Of Your Database];
放在顶部,然后是alter table 语句。你不能在 Visual Studio 的程序中使用它。以上是关于MVC - ALTER TABLE DROP COLUMN 失败,因为一个或多个对象访问此列的主要内容,如果未能解决你的问题,请参考以下文章
Hive - Create Table&Drop Table & ALTER Table(中)
Hive - Create Table&Drop Table & ALTER Table(上)