Sqlite迁移中的删除列

时间:2018-12-18 15:26:40

标签: c# sqlite migration entity-framework-core ef-migrations

我使用EntityFrameworkCore.Sqlite,并且希望使用Migration一切正常,但是当我要删除列时,无法更新数据库。我知道Sqlite有局限性。

这是我处理此问题的方法:

  

1。创建新表
  2.将旧表数据插入到新表中
  3.删除oldTable
  4.将新表重命名为oldtable

protected override void Down(MigrationBuilder migrationBuilder)
{
    migrationBuilder.CreateTable(name: "XSettings",
       columns: table => new
       {
           Id = table.Column<int>(nullable: false)
               .Annotation("Sqlite:Autoincrement", true),
           Name = table.Column<string>(nullable: true),
           LName = table.Column<string>(nullable: true)
       },
       constraints: table =>
       {
           table.PrimaryKey("PK_Settings", x => x.Id);
       });

    migrationBuilder.Sql("ALTER TABLE Settings DROP COLUMN HName;");
    migrationBuilder.Sql("INSERT INTO XSettings * FROM Settings;");

    migrationBuilder.DropTable(name: "Settings");
    migrationBuilder.Sql("ALTER TABLE XSettings RENAME TO Settings;");
}

但是当我运行我的应用程序时,HName列仍然存在,那么如何删除列?

1 个答案:

答案 0 :(得分:0)

使用SQLiteStudio

要执行放置列操作,由于SQLite的限制,您必须提供行SQL代码。 Microsoft Docs: SQLite Limitations

  1. SQLiteStudio网站下载SQLiteStudio

  2. 加载本地数据库文件

  3. 删除所需的列,并通过“更改结构”(绿色的ok按钮)显示SQL语句
  4. 复制生成的代码进行迁移,然后将其复制到 migrationBuilder.Sql("...");语句,也可以将其拆分为多个语句

复制到C#时只需注意

SQLiteStudio generated SQLite Statements