創建表Entity Framework Core和SQLite

entity-framework-core sqlite

使用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命令db.DataBase.Migrate這一點

將上下文的任何掛起的遷移應用於數據庫。

什麼是pending migrations ?我似乎無法在這些地方找到任何文件。

我結合以下的例子:

編輯:如果我替換db.Database.Migrate();db.Database.EnsureCreated();有用。從文檔中, Migrate()是相同的,但允許您創建表結構的更新,其中EnsureCreated()不會。我很困惑。

一般承認的答案

所以,

微軟有一個嚴肅的問題,製作體面的文檔,但我確實發現一個網站有一些有點過時的學習實體框架核心文檔,特別是鏈接中的遷移。

在頂部,它提到,

如果您有Visual Studio,則可以使用程序包管理器控制台(PMC)來管理遷移。

這導致了包管理器控制台頁面,它在頂部顯示,您需要:

如果要使用程序包管理器控制台執行遷移命令,則需要確保將最新版本的Microsoft.EntityFrameworkCore.Tools添加到project.json文件中。

問題是,我的項目(或解決方案)中的任何地方都沒有project.json文件。經過一番搜索,我發現通過NuGet,添加了Microsoft.EntityFrameworkCore.Tools

然後通過Tools > NuGet Package Manager > Package Manager Console我可以運行add-migration InitialDatabases命令。最後一部分InitialDatabases是它為您創建的類的名稱,並粘貼在項目基礎上名為Migrations的文件夾中。

現在,當:

context.Database.Migrate();

運行,一切都很好!


熱門答案

試試這個(幾個月前在一個項目中為我工作,我不記得為什麼):

 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) )。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow