«Файл не является базой данных» или «Миграции не были применены. База данных уже обновлена. при создании Database.sqlite не по умолчанию - PullRequest
0 голосов
/ 25 января 2019

Я очень новичок в программировании на C #, читая серию видеоуроков с использованием Discord.net и sqlite, чтобы создать бота для моего сервера для добавления различных команд и автоматизации различных задач.

В учебнике все шло хорошо, пока я не достиг шестой части, https://www.youtube.com/watch?v=-Lf6w7WZvT0. Чуть позже 12:30 автор пытается использовать update-database в консоли диспетчера пакетов для создания базы данных с именем * 1006. * в нестандартном месте. Однако попытка создать эту базу данных так, как он это написал, приводит к ошибке, SQLite Error 26: 'file is not a database'.

Решение автора учебника состоит в том, чтобы создать базу данных в расположении по умолчанию, вручную переместить ее в предпочтительное расположение, а затем отредактировать код для использования предпочтительного расположения. Мне это кажется нелегким, и я хотел бы выяснить, как заставить консоль диспетчера пакетов создавать программу в правильном месте.

Вот программа, как ее изначально написал автор учебника

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 и не нашел ничего полезного. Я также проверил страницу API для DbContextOptionsBuilder на https://docs.microsoft.com/en-us/ef/core/api/microsoft.entityframeworkcore.dbcontextoptionsbuilder и не смог найти ничего, что указывало бы, почему это не работает.

Любая помощь в получении файла Database.sqlite для записи в MyBot\Data будет очень признательна.

...