首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架SQLite无法检索相关对象

实体框架SQLite无法检索相关对象
EN

Stack Overflow用户
提问于 2020-05-19 18:23:10
回答 1查看 186关注 0票数 0

我试着用WPF重新创建windows 10中的便笺应用程序。我将实体框架与SQLite数据库结合使用。EF无法检索另一个对象的子对象。我怎么能这么做?

我基本上有两个类,我想存储在这个数据库中,StickyNote和SitckyNoteGroup。每个StickyNote都有一个StickyNoteGroup。为了让您完全理解,我将发布与我的问题相关的所有类,但是如果您想要https://github.com/Kamigoro/StickyNotes,这里是github。

代码语言:javascript
复制
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}";
        }

    }
}
代码语言:javascript
复制
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的类如下所示,名为NoteContext

代码语言:javascript
复制
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操作的类名为DataAccessor,如下所示。

代码语言:javascript
复制
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数据库中有?

代码语言:javascript
复制
        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());
            }
        }

StickyNote表:

StickyNoteGroup表:

非常感谢你的回答。如果您对我的代码还有其他评论要做,它们是受欢迎的,因为我真的不知道使用这样的ORM的好模式。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-19 18:35:35

似乎您需要添加Include调用:

代码语言:javascript
复制
 public static List<StickyNote> GetStickyNotes()
    {
        List<StickyNote> notes;
        using (var database = new NoteContext())
        {
            notes = database.Notes
                .Include(n => n.Group)
                .ToList();
        }
        return notes;
    }

顺便说一句,您可以从内部的ToList语句返回计算过的查询结果数据(例如通过ToArrayFirst等):

代码语言:javascript
复制
 public static List<StickyNote> GetStickyNotes()
    {
        using (var database = new NoteContext())
        {
            return database.Notes
                .Include(n => n.Group)
                .ToList();
        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61898100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档