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");

【讨论】:

我可以用这个删除,但是我想在Ovelserpublic 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 失败,因为一个或多个对象访问此列的主要内容,如果未能解决你的问题,请参考以下文章

DDL中drop-alter table

Hive - Create Table&Drop Table & ALTER Table(中)

Hive - Create Table&Drop Table & ALTER Table(上)

ALTER TABLE DROP COLUMN 失败,因为一个或多个对象访问此列

mysql对字段的操作

在 alter table drop column 之后优化表是不是有意义?