SQLite-Net扩展- GetAllWithChildrenAsync未提取所有内容

rt4zxlrg  于 2023-03-19  发布在  SQLite
关注(0)|答案(1)|浏览(141)

我正在尝试使用SQLite-Net Extensions创建关系数据库。尝试从数据库中提取Term对象时遇到问题。它成功提取了其关联课程,但未提取课程关联的测评和注解。我不确定问题是否在于如何将对象插入数据库,如何从数据库中提取对象,或者我如何列出对象属性。
我觉得SQLite-Net扩展文档非常有限,所以我甚至不知道发生了什么。我尝试了许多不同的方法,包括添加CascadeOperations,但似乎没有一个有帮助。
下面是我的对象的(简化)代码:

[Table("Terms")]
public class Term
{
    [PrimaryKey, AutoIncrement]
    public int ID { get; set; }
    public string Name { get; set; }
    [OneToMany]
    public List<Course> Courses { get; set; }

    public Term() { }
    public Term(string name, List<Course> courses)
    {
        Name = name;
        Courses = courses;
    }

课程

[Table("Courses")]
public class Course
{
    [PrimaryKey, AutoIncrement]
    public int ID { get; set; }
    [ForeignKey(typeof(Term))]
    public int TermID { get; set; }
    public string Name { get; set; }
    [OneToMany]
    public List<Assessment> Assessments { get; set; }
    [OneToMany]
    public List<Note> Notes { get; set; }

    public Course() { }

    public Course(string name, List<Assessment> assessments, List<Note> notes)
    {
        Name = name;
        Assessments = assessments;
        Notes = notes;
    }
}

评估

[Table("Assessments")]
public class Assessment
{
    [PrimaryKey, AutoIncrement]
    public int ID { get; set; }
    [ForeignKey(typeof(Course))]
    public int CourseID { get; set; }
    public string Name { get; set; }

    public Assessment() { }
    public Assessment(string name)
    {
        Name = name;
    }
}

附注

[Table("Notes")]
public class Note
{
    [PrimaryKey, AutoIncrement]
    public int ID { get; set; }
    [ForeignKey(typeof(Course))]
    public int CourseID { get; set; }
    public string Name { get; set; }
    public string Text { get; set; }

    public Note() { }
    public Note(string name, string note)
    {
        Name = name;
        Text = note;
    }
}

下面是插入和获取对象的代码:插入

public bool SaveTermAsync(Term term)
    {
        if (term.ID != 0)
        {
            _database.UpdateWithChildrenAsync(term);
            return true;
        }
        else
        {
            foreach (var course in term.Courses)
            {
                foreach (var assessment in course.Assessments)
                {
                    _database.InsertAsync(assessment);
                }
                foreach (var note in course.Notes)
                {
                    _database.InsertAsync(note);
                }
                _database.InsertAsync(course);
            }
            _database.InsertAsync(term);
            _database.UpdateWithChildrenAsync(term);
            return false;
        }
    }

获取

public Task<List<Term>> GetTermsAsync()
    {
        return _database.GetAllWithChildrenAsync<Term>();
    }

我知道这有点像代码转储,但我不知道哪里或什么地方可能出了问题。如果有人能给予任何关于潜在错误的信息,那就太棒了。也许我只是在期待一些事情发生,而实际上它并不是这样工作的。我不知道。
此外,如果任何人有任何链接到一些更好的文档比https://bitbucket.org/twincoders/sqlite-net-extensions/src/master/这将是可怕的

编辑

我也尝试使用级联选项,包括CascadeRead、CascadeInsert和CascadeAll。将CascadeInsert或CascadeAll与_database一起使用。InsertWithChildrenAsync(term,true)导致崩溃。崩溃不提供任何错误消息,甚至用try catch块 Package InsertWithChildren也不起作用。删除递归bool导致程序不崩溃,并且实际上得到了我想要的最接近的东西。Assessments和Notes不再是null,但是仍然是空的。下面是我更新的代码:
保存和获取:

public async Task<List<Term>> GetTermsAsync()
    {
        return await _database.GetAllWithChildrenAsync<Term>(recursive: true);
    }

public async void SaveTermAsync(Term term)
    {
        if (term.ID != 0)
        {
            await _database.UpdateWithChildrenAsync(term);
        }
        else
        {
            //Trying this with recursion results in crash
            await _database.InsertWithChildrenAsync(term);
        }
    }

一对多关系:

//In Term
[OneToMany(CascadeOperations = CascadeOperation.All)]
public List<Course> Courses { get; set; }

//In Courses
[OneToMany(CascadeOperations = CascadeOperation.All)]
public List<Assessment> Assessments { get; set; }
[OneToMany(CascadeOperations = CascadeOperation.All)]
public List<Note> Notes { get; set; }

另外,上次我忘了首先说明我是如何填充表的。

public bool CreateTables()
    {
        _database.CreateTableAsync<Term>().Wait();
        _database.CreateTableAsync<Course>().Wait();
        _database.CreateTableAsync<Assessment>().Wait();
        _database.CreateTableAsync<Note>().Wait();
        return true;
    }

    public Task<int> ClearTablesTest()
    {
        _database.DropTableAsync<Term>();
        _database.DropTableAsync<Course>();
        _database.DropTableAsync<Assessment>();
        return _database.DropTableAsync<Note>();
    }

async public Task<int> PopulateTestData()
    {
        await ClearTablesTest();
        CreateTables();

        Term term = new Term("Test Term", true, DateTime.Now, DateTime.Now.AddDays(10),
            new List<Course>
            {
                new Course("Test Course", CourseStatus.Completed, "Guys Name", "(999)-999-9999", "email@gmail.com", 6, DateTime.Now, DateTime.Now.AddDays(10),
                new List<Assessment>
                {
                    new Assessment("Test Assessment", AssessmentType.Objective, false, DateTime.Now, DateTime.Now.AddDays(10))
                },
                new List<Note>
                {
                    new Note("Test Note", "This is a test note.")
                })
            });
        App.Database.SaveTermAsync(term);
        return 0;
    }
0mkxixxg

0mkxixxg1#

我终于弄清楚了是什么导致了崩溃,以及在SQLite-Net扩展中引起了普遍的混乱。
在我的评估课程中,房产

public string BackgroundColor
    {
        get { return IsComplete ? "#558f45" : "Gray"; }
        set { BackgroundColor = value; }
    }

在使用递归时导致了崩溃。我已经搜索了Web两个多星期来寻找这个问题的解决方案,但没有找到任何类似的东西。我提交了一个关于SQLite-Net Extensions bitbucket的bug报告。
如果有人知道为什么这一行会导致问题,我很乐意听到你的意见。在此之前,我会将这个问题标记为已回答,并继续我的应用程序的工作。
感谢@redent84迄今为止在此问题上提供的帮助。

相关问题