根据 Documentation,EF Core SQLite 不支持使用迁移进行数据库开发的一些基本操作(例如删除列、设置外键等)。
那么如何执行简单的数据库结构更改,例如在不丢失数据的情况下删除列并保持快照模型与数据库同步(无脚手架)?

是否值得付出努力,还是我应该先使用数据库并为模型使用脚手架命令更新?
如果我不能在迁移中执行所有必要的操作来更新我的数据库,那么我就不能利用迁移的好处来恢复我的数据库结构。
那么在 EF-Core-Sqlite 中使用迁移的优势在哪里呢?
ORM 应该减少工作,而不是使工作变得更加困难。

最佳答案

更新
Sqlite Migrations: Table rebuilds 现在可用于 EF Core 5。
原答案

主要思想在 EF Core Documentation : Migrations limitations workaround 中描述

例如,我们使用以下 Blog 表创建了一个数据库

public class Blog
{
    public int BlogId { get; set; }
    public string Name { get; set; }
    public string Foo { get; set; }
}
...然后我们要删除 Foo
为此,请删除上面显示的 Blog.Foo 类属性。
然后添加迁移以生成 Migration 类。
由于 SQLite 不支持 MigrationBuilder.DropColumn,我们应该按照文档中的描述修改 Up 迁移方法。
protected override void Up(MigrationBuilder migrationBuilder)
{
    // Create temporary Blog table with new schema
    migrationBuilder.CreateTable(
        name: "Blog_temp_new",
        columns: table => new
        {
            BlogId = table.Column<int>(nullable: false)
                .Annotation("Sqlite:Autoincrement", true),
            Name = table.Column<string>(nullable: true)
        },
        constraints: table =>
        {
            table.PrimaryKey("PK_Blog", x => x.BlogId);
        });

    // Copy Blog to Blog_temp_new
    migrationBuilder.Sql("INSERT INTO Blog_temp_new (BlogId, Name) SELECT BlogId, Name FROM Blog;");

    // Delete Blog
    migrationBuilder.DropTable("Blog");

    // Rename Blog_temp_new to Blog
    migrationBuilder.RenameTable("Blog_temp_new", newName: "Blog");
}
调用 Blog 时,所有 BlogId 数据及其 NameDatabase.Migrate 将被保留。
我建议你在一个新项目中尝试这个,使用一个简单的单一类,比如 Blog 示例。如果您的表有约束或索引,您还需要做其他事情。但是,如果您在一个简单的沙箱中进行试验,而不是尝试在您的主项目中修复它,您应该能够轻松学会如何处理这些问题。

根据我的经验,是的!我发现与数据库优先相比,模型优先更容易使用。我更喜欢尽可能用 C# 做所有事情,但如果您是 SQL 专家,那么您的观点可能与我的不同。 :)

关于c# - 处理 SQLite EF 核心限制 - 基础操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56609441/

10-14 18:04