Используя Microsoft.EntityFrameworkCore.SQLite, я пытаюсь создать базу данных на уровне кода и добавить простую строку в таблицу. Я получил ошибку, SQLite error: no such table Jumplists.

От последнего к первому, вот классы

using JumpList_To_Clipboard.Data.Tables;
using Microsoft.EntityFrameworkCore;

namespace JumpList_To_Clipboard.Data
{
    public class DataSQLite : IData
    {
        public const string DATABASE = "data.sqlite";

        public DataSQLite()
        {
            using (var db = new SQLiteDbContext(DATABASE))
            {
                // Ensure database is created with all changes to tables applied
                db.Database.Migrate();

                db.JumpLists.Add(new JumpList { Name = "Default" });
                db.SaveChanges(); // Exception thrown here
            }
        }
    }
}

Класс DbContext

using JumpList_To_Clipboard.Data.Tables;
using Microsoft.EntityFrameworkCore;

namespace JumpList_To_Clipboard.Data
{
    class SQLiteDbContext : DbContext
    {
        readonly string db_path;

        public DbSet<JumpList> JumpLists { get; set; }
        public DbSet<Group> Groups { get; set; }
        public DbSet<Item> Items { get; set; }

        public SQLiteDbContext(string database) : base()
        {
            db_path = database;
        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlite(string.Format("Data Source={0}", db_path));
        }
    }
}

Класс JumpList

using System.Collections.Generic;

namespace JumpList_To_Clipboard.Data.Tables
{
    public class JumpList
    {
        public int JumpListId { get; set; }
        public string Name { get; set; }

        public List<Group> Groups { get; set; }
        public List<Item> Items { get; set; }
    }
}

Два других класса не стоит повторять здесь и не дают ошибок.

Когда я использую расширение firefox sqlite для просмотра файла data.sqlite, ни одна из моих трех таблиц не отображается в списке.

Команда db.DataBase.Migrate говорит это

Применяет любые ожидающие миграции для контекста к базе данных.

Что такое pending migrations? Кажется, я не могу найти какую-либо документацию по этим вопросам.

Я объединяю примеры из:

Изменить . Если я заменю db.Database.Migrate(); на db.Database.EnsureCreated();, это сработает. Из документации Migrate() то же самое, но позволяет создавать обновления для структур таблиц, а EnsureCreated() - нет. Я запутался.

3
Chuck Savage 28 Май 2017 в 08:31

2 ответа

Лучший ответ

Так,

У Microsoft есть серьезная проблема с созданием приличной документации, но я нашел сайт, на котором есть несколько устаревшая документация для Learning Entity Framework Core, конкретно миграции, которая есть в ссылке.

Вверху упоминается,

Если у вас есть Visual Studio, вы можете использовать Консоль диспетчера пакетов (PMC) для управления миграциями.

Это привело к появлению консоли диспетчера пакетов, которая находится прямо вверху, что тебе нужно иметь:

Если вы хотите использовать консоль диспетчера пакетов для выполнения команды миграции, вам необходимо убедиться, что в ваш project.json файл добавлена последняя версия Microsoft.EntityFrameworkCore.Tools.

Проблема в том, что в моем проекте (или решении) нет файла project.json. После некоторых поисков я нашел это через NuGet, чтобы добавить Microsoft.EntityFrameworkCore.Tools

Затем через Tools > NuGet Package Manager > Package Manager Console я смог запустить команду add-migration InitialDatabases. Последняя часть InitialDatabases - это имя класса, который он создает для вас, и он помещается в папку с именем Migrations в основании проекта.

Теперь когда:

context.Database.Migrate();

Работает, все хорошо!

0
Chuck Savage 31 Май 2017 в 03:39

Попробуйте это (работал для меня в проекте несколько месяцев назад, я не помню почему):

 public virtual DbSet<JumpList> JumpLists { get; set; }
 public virtual DbSet<Group> Groups { get; set; }
 public virtual DbSet<Item> Items { get; set; }

Также мне пришлось использовать LONG вместо INT для ID классов, потому что sqlite использует LONG по умолчанию для ID таблицы, поэтому после выполнения операции CRUD происходит сбой, потому что он не может сравнивать / преобразовывать / приводить LONG (64) к INT (32). ) .

0
charly989 28 Май 2017 в 06:17