c# - 如何在加密的 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 Browser和SQLiteStudio中的数据库。
我查看了这个存储库,我有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)在我的项目中添加的包。
我看过很多论坛上的很多帖子,但没有一个提到使用加密数据库进行迁移。我可能遗漏了一些非常明显的东西,但是任何帮助解决这个错误将不胜感激,谢谢!
解决方案
我认为您需要添加密码 XD
如果您有其他问题,请查看官方文档中的指定密钥部分。
加密和解密现有数据库的方法因您使用的解决方案而异。例如,您需要在 SQLCipher 上使用 sqlcipher_export() 函数。查看解决方案的文档以了解详细信息。
您可以使用 SQLCipher API 来完成您的工作:
如果要构建加密数据库,只需设置连接字符串,如下所示:
Data Source = encryptedName.db; Password=YourPassword
如果要更改加密数据库中的密码
// 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();
如果要加密明文 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;";
- 如果您在 Asp.net Core 和 Entity Framework Core 中有一些性能问题,您需要检查这些
- SQLite 和 Microsoft.EntityFrameworkCore.Sqlite.Core 和 SQLitePCLRaw.bundle_e_sqlcipher 的性能
- Entity Framework Core 连接管理
- Microsoft.Data.Sqlite:池连接 #13837
- 如果你有其他性能问题,你可以检查这个SQLCipher Performance Optimization
推荐阅读
- python - 类型错误:sentiment_analysis() 缺少 1 个必需的位置参数:“极性”?
- javascript - 在“新”生成的承诺中“返回承诺”和“用承诺解决”之间的不同行为
- ios - 为 Apple Mail 创建插件
- java - BufferedReader readline 如何在连续程序中工作?
- javascript - Google App Script + Google Sheet + HTML modal dialog input form - 获取值并构建电子邮件
- html - 是否可以根据表格单元格的内容在列上使用 CSS 宽度转换?
- angular - 角 | 如何将参数添加到 URL (some-url?param1=foo)
- r-exams - R-exams:如何更改多项选择的标签以区分完形填空项目(a,b,...)
- python - FastAPI 自定义错误处理破坏了自动文档
- python - 尝试根据 DJango 中提供的登录凭据重定向到不同的页面