ASP.在“代码优先”数据库更新期间出现意外列

本文关键字:更新 意外 数据库 代码 代码优先 ASP | 更新日期: 2023-09-27 18:05:57

所以我今天遇到了奇怪的情况-当用新表更新现有数据库时,我在其中一个表中得到了额外的列。

它的样子:

  • Raport.cs

    public class Raport
    {
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        [Key]
        public string raport_id { get; set; } //id raportu
        public string userID { get; set; }
        public DateTime creation_time { get; set; }
        public DateTime last_modyfication { get; set; }
    
        public virtual ICollection<ThrashType> ThrashType { get; set; }
        public virtual UserFrontInfo UserFrontInfo { get; set; }   
    

    }

  • ThrashType.cs

     public class ThrashType
       {     
        [Key] 
        //[DatabaseGenerated(DatabaseGeneratedOption.None)] 
        public int IdTrash { get; set; }
        public string RaportId { get; set; } 
        public string ClassName { get; set; } 
        public int Quantity { get; set; }            
        public string Information { get; set; } 
        public virtual Raport Raport { get; set; }   
    }
    
  • UserFrontInfo.cs

    public class UserFrontInfo
    {
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        [Key]
        public string userId { get; set; } 
        public string userName { get; set; } 
        public string whereFromName { get; set; } 
        public virtual ICollection<Raport> Raport { get; set; }  
    }
    

在遇到这种情况之前我做了什么:1/添加迁移2/因为我需要添加新的表,我遵循如下:重置实体-框架迁移(答案下第一条评论;更可读版本):

感谢Greg Gum (https://stackoverflow.com/users/425823/greg-gum)

问题:你已经搞砸了你的迁移,你想在不删除现有表的情况下重置它。问题:你做不到按照EF的要求重置数据库中现有表的迁移从头开始创建表。怎么做:删除现有的迁移从Migrations_History表。中删除现有迁移迁移文件夹。执行add-migration Reset。这将创建一个迁移到migration文件夹中,包括创建表(但它不会运行它,所以它不会出错。)现在您需要在MigrationHistory表中创建初始行,以便EF有一个当前状态的快照。如果您应用a, EF将执行此操作迁移。但是,您不能应用刚刚完成的迁移因为这些表已经存在于数据库中。所以进入迁移并注释掉"Up"方法中的所有代码。现在运行- database就。它将应用迁移(虽然实际上不是)更改数据库),并在MigrationHistory中创建快照行。现在您已经重置了迁移,可以继续正常操作迁移。

然后一切都工作得很好,但在ThrashType表中,我有额外的列名为"Raport_raport_id"。

ASP.在“代码优先”数据库更新期间出现意外列

答案是将ThrashType中的字段名称从"RaportId"更改为"raport_id",删除dbo。ThrashType并重新创建上面的步骤。

我想指出的是,我已经从上面的步骤中添加了一件事-在"number_digits_migration_file".cs中,我只注释掉了现有的表,而忽略了我想要创建的表。

虽然我解决了我的问题,但我对它很好奇。有人对代码优先方法有过这样的经验吗?祝你有美好的一天!