簡體   English   中英

實體框架 SQLite 無法檢索相關 object

[英]Entity Framework SQLite can't retrieve related object

我正在嘗試使用 WPF 在 windows 10 中重新創建便簽應用程序。 我正在使用帶有 SQLite 數據庫的實體框架。 並且 EF 無法檢索 object 這是另一個孩子的孩子。 我怎樣才能做到這一點?

我基本上有 2 個類我想存儲在這個數據庫 StickyNote 和 SitckyNoteGroup 中。 每個 StickyNote 都有一個 StickyNoteGroup。 為了讓您充分理解,我將發布與我的問題相關的所有類,但如果您想要https://github.com/Kamigoro/StickyNotes ,這里是 github 存儲庫。

namespace Todo.Models
{
    public class StickyNote
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Text { get; set; }
        public StickyNoteGroup Group { get; set; }

        public override string ToString()
        {
            return $"Name : {Name}\nText : {Text}";
        }

    }
}
namespace Todo.Models
{
    public class StickyNoteGroup
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Color { get; set; }

        public override string ToString()
        {
            return $"Name : {Name}\nColor : {Color}";
        }
    }
}

我使用 EntityFramework 的 class 看起來像這樣,被稱為 NoteContext

using Microsoft.EntityFrameworkCore;

namespace Todo.Models.DataAccess
{
    public class NoteContext : DbContext
    {
        public DbSet<StickyNote> Notes { get; set; }
        public DbSet<StickyNoteGroup> NoteGroups { get; set; }


        protected override void OnConfiguring(DbContextOptionsBuilder options)
            => options.UseSqlite("Data Source=Todo.db");

    }
}

最后,我用來執行 CRUD 操作的 class 稱為 DataAccessor,看起來像這樣。

namespace Todo.Models.DataAccess
{
    public static class DataAccessor
    {
        public static List<StickyNote> GetStickyNotes()
        {
            List<StickyNote> notes;
            using (var database = new NoteContext())
            {
                notes = database.Notes.ToList();
            }
            return notes;
        }

        public static void SaveStickyNote(StickyNote stickyNote)
        {
            using (var database = new NoteContext())
            {
                database.Notes.Add(stickyNote);
                database.SaveChanges();
            }
        }

        public static List<StickyNoteGroup> GetStickyNoteGroups()
        {
            List<StickyNoteGroup> noteGroups;
            using (var database = new NoteContext())
            {
                noteGroups = database.NoteGroups.ToList();
            }
            return noteGroups;
        }

        public static void SaveStickyNoteGroup(StickyNoteGroup stickyNoteGroup)
        {
            using (var database = new NoteContext())
            {
                database.NoteGroups.Add(stickyNoteGroup);
                database.SaveChanges();
            }
        }

    }
}

我的問題是為什么這部分代碼告訴我當前 StickyNote 沒有 StickyNoteGroup,即使 sqlite 數據庫中有一個?

        private void btnAddStickyNote_Click(object sender, RoutedEventArgs e)
        {
            StickyNoteGroup group = new StickyNoteGroup() { Name = "Test Group", Color = "Red" };
            StickyNote note = new StickyNote() { Name = "Note 1", Text = "An attempt to write a note", Group = group };
            DataAccessor.SaveStickyNote(note);

            foreach (StickyNote currentNote in DataAccessor.GetStickyNotes())
            {
                Debug.WriteLine(currentNote.Group.ToString());
            }
        }

便簽表:
便簽表

便箋組表:
便箋組表

非常感謝你的回答。 如果您對我的代碼有其他意見,歡迎提出,因為我真的不知道使用這樣的 ORM 的良好模式。

看來您需要添加Include調用:

 public static List<StickyNote> GetStickyNotes()
    {
        List<StickyNote> notes;
        using (var database = new NoteContext())
        {
            notes = database.Notes
                .Include(n => n.Group)
                .ToList();
        }
        return notes;
    }

順便說一句,您可以從using語句內部返回評估的查詢結果數據(例如通過ToListToArrayFirst等):

 public static List<StickyNote> GetStickyNotes()
    {
        using (var database = new NoteContext())
        {
            return database.Notes
                .Include(n => n.Group)
                .ToList();
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM