我是一位非常新手的C#程序员,遵循一系列使用Discord.net和sqlite的视频教程,为服务器创建一个机器人以添加各种命令并自动执行各种任务。
在本教程中,一切都进展顺利,直到我达到了第六期https://www.youtube.com/watch?v=-Lf6w7WZvT0。 12:30之后,作者尝试在Package Manager控制台中使用update-database
在非默认位置创建一个名为Database.sqlite
的数据库。但是,尝试以他编写数据库的方式创建该数据库会导致错误SQLite Error 26: 'file is not a database'.
教程作者的解决方案是在默认位置创建数据库,手动将其移动到首选位置,然后编辑代码以使用首选位置。对我来说,这似乎不太优雅,我想弄清楚如何使Package Manager Console在正确的位置创建程序。
这是教程作者最初编写的程序
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text;
namespace MyBot.Resources.Database
{
public class SqliteDbContext : DbContext
{
public DbSet<Stone> Stones { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder Options)
{
string DbLocation = string DbLocation = Assembly.GetEntryAssembly().Location.Replace(@"bin\Debug\netcoreapp2.1",
@"Data\Database.sqlite");
Options.UseSqlite("Data Source=" + DbLocation);
}
}
}
这会导致file is not a database
错误。
然后他将其更改为
string DbLocation = string DbLocation = Assembly.GetEntryAssembly().Location.Replace(@"bin\Debug\netcoreapp2.1",
@"Data\Database.sqlite");
Options.UseSqlite("Data Source=Database.sqlite"_;
这将在Database.sqlite
目录中创建一个MyBot
文件,然后作者将其移至MyBot\Data
目录。然后,他将程序更改为
string DbLocation = string DbLocation = Assembly.GetEntryAssembly().Location.Replace(@"bin\Debug\netcoreapp2.1",
@"Data\");
Options.UseSqlite($"Data Source={DbLocation}Database.sqlite";
然后程序将按预期运行。
我删除了Database.sqlite
文件并重新运行上面的代码以查看发生了什么,并得到了消息No migrations were applied. The database is already up to date.
每次执行不同的步骤都会得到相同的结果。
我试图用Google搜索这两个错误消息,但没有发现任何有用的信息。我还在https://docs.microsoft.com/en-us/ef/core/api/microsoft.entityframeworkcore.dbcontextoptionsbuilder的api页面上检查了DbContextOptionsBuilder
,找不到任何表明其无法正常工作的信息。
任何帮助您将Database.sqlite
文件写入MyBot\Data
的帮助。