我试着用WPF重新创建windows 10中的便笺应用程序。我将实体框架与SQLite数据库结合使用。EF无法检索另一个对象的子对象。我怎么能这么做?
我基本上有两个类,我想存储在这个数据库中,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的类如下所示,名为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操作的类名为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());
}
}StickyNote表:

StickyNoteGroup表:

非常感谢你的回答。如果您对我的代码还有其他评论要做,它们是受欢迎的,因为我真的不知道使用这样的ORM的好模式。
发布于 2020-05-19 18:35:35
似乎您需要添加Include调用:
public static List<StickyNote> GetStickyNotes()
{
List<StickyNote> notes;
using (var database = new NoteContext())
{
notes = database.Notes
.Include(n => n.Group)
.ToList();
}
return notes;
}顺便说一句,您可以从内部的ToList语句返回计算过的查询结果数据(例如通过ToArray、First等):
public static List<StickyNote> GetStickyNotes()
{
using (var database = new NoteContext())
{
return database.Notes
.Include(n => n.Group)
.ToList();
}
}https://stackoverflow.com/questions/61898100
复制相似问题