首页 > 解决方案 > 如何在加密的 SQLite 数据库上使用 Entity Framework Core 运行迁移?

问题描述

我有一个使用 Entity Framework Core 的 ASP.NET Core 控制台应用程序(针对 2.2 版)。我正在尝试连接到使用DB Browser for SQLCipher 创建的空的加密 SQLite 数据库。创建连接后,我正在尝试迁移数据库,但我得到了一个'SQLite Error 26: 'file is not a database'.'

这是我的代码:

var connection = new SqliteConnection(@"Data Source=Sqlite\test.db;");

connection.Open();

var command = connection.CreateCommand();
var password = "test";
command.CommandText = "SELECT quote($password);";
command.Parameters.AddWithValue("$password", password);
var quotedPassword = (string)command.ExecuteScalar();

command.CommandText = "PRAGMA key = " + quotedPassword;
command.Parameters.Clear();
var result = command.ExecuteNonQuery();

services.AddDbContext<SmartContext>(options =>
        options.UseSqlite(connection));

var serviceProvider = services.BuildServiceProvider();
var context = serviceProvider.GetService<MyContext>();

Console.WriteLine("Migrating sqlite database");

context.Database.Migrate();

我能够连接到DB BrowserSQLiteStudio中的数据库。

我查看了这个存储库,我有SQLitePCLRaw.bundle_sqlcipher (1.1.11)SQLitePCLRaw.bundle_green (1.1.11)Microsoft.EntityFrameworkCore.Design (2.2.6)Microsoft.EntityFrameworkCore.Sqlite.Core (2.2. 6)在我的项目中添加的包。

我看过很多论坛上的很多帖子,但没有一个提到使用加密数据库进行迁移。我可能遗漏了一些非常明显的东西,但是任何帮助解决这个错误将不胜感激,谢谢!

标签: c#sqliteentity-framework-coresqlcipherdb-browser-sqlite

解决方案


我认为您需要添加密码 XD


如果您有其他问题,请查看官方文档中的指定密钥部分

加密和解密现有数据库的方法因您使用的解决方案而异。例如,您需要在 SQLCipher 上使用 sqlcipher_export() 函数。查看解决方案的文档以了解详细信息。

您可以使用 SQLCipher API 来完成您的工作:

  1. 如果要构建加密数据库,只需设置连接字符串,如下所示:Data Source = encryptedName.db; Password=YourPassword

  2. 如果要更改加密数据库中的密码

    // you can use this in startup.cs
    using var changePasswordDb = new DBContext(
        new SqliteConnection(
                new SqliteConnectionStringBuilder()
                    {
                         DataSource = "encryptedName.db",
                         Mode = SqliteOpenMode.ReadWriteCreate,
                         Password = oldPassword
                    }.ToString()
            ));
    changePasswordDb.Database.ExecuteSqlRaw($"PRAGMA rekey = {newPassword}");
    
    // or use SqliteConnection
    var connection = new SqliteConnection("Data Source =encryptedName.db.db;Password=yourPassword");
    connection.Open();
    var command = connection.CreateCommand();
    command.CommandText = "PRAGMA rekey = " + newPassword;
    command.ExecuteNonQuery();  
    
  3. 如果要加密明文 SQLite 数据库,不直接支持 SQLCipher。所以你可以使用 sqlcipher_export() 来达到目标​​。看看这个How to encrypt a plaintext SQLite database to use SQLCipher (并避免“文件已加密或不是数据库”错误)

// Example
command.CommandText = "ATTACH DATABASE 'encryptedName.db' AS encrypted KEY 'YourNewPassword';SELECT sqlcipher_export('encrypted');DETACH DATABASE encryptedName;";
  1. 如果您在 Asp.net Core 和 Entity Framework Core 中有一些性能问题,您需要检查这些
  1. 如果你有其他性能问题,你可以检查这个SQLCipher Performance Optimization

推荐阅读