Как выполнять операции CRUD для таблицы с внешним ключом с помощью SQLiteNet-Extensions

Я использую sqlite-net-pcl с SqLiteNetExtensions для внешнего ключа. У меня есть эти две таблицы (не уверен, что они написаны правильно) повестка дня может содержать много задач, мой вопрос в том, как мне написать методы CRUD для добавления/удаления/загрузки моих задач в мою повестку дня, я не уверен, как это работает когда у вас есть внешний ключ?

Я пытался понять документацию: https://bitbucket.org/twincoders/sqlite-net-extensions/src/master/

Без какого-либо успеха я не понимаю, что методы WithChildren, похоже, не распознаются, если только database = new SQLiteAsyncConnection(dbPath); не работает для SqliteNetExtensions. Обратите внимание, что методы CRUD для моей повестки дня работают, но я пытаюсь реализовать методы CRUD для задач. Кроме того, в моем методе повестки дня, называемом GetAgendaAsync(), я не уверен, загрузит ли он данные с уже заданными задачами или мне нужно что-то сделать, чтобы добавить к нему задачи при загрузке?

Спасибо, я немного потерялся с этим.

Agenda.cs в папке "Модели"

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Text;
using SQLite;
using Calculette.Database;
using SQLiteNetExtensions.Attributes;
    [Table("Agenda")]
    public class Agenda
    {
        [PrimaryKey, AutoIncrement]
        public int ID { get; set; }
        public string Topic { get; set; }
        public string Duration { get; set; } 
        public DateTime Date { get; set; }
        [OneToMany(CascadeOperations = CascadeOperation.All)]
}

Tasks.cs в папке Models

using System;
using System.Collections.Generic;
using System.Text;
using SQLite;
using SQLiteNetExtensions.Attributes;
[Table("Task")]
public class Tasks
{
    [PrimaryKey, AutoIncrement]
    public int ID { get; set; }
    
    [ForeignKey(typeof(Agenda))]
    public string Name { get; set; }
    public string Time { get; set; }
    [ManyToOne]
    public Agenda Agenda { get; set; }
    
}

AgendaDatabase.cs в папке базы данных (все мои операции в настоящее время для таблицы Agenda)

using System;
using System.Collections.Generic;
using System.Text;
using SQLite;
using Calculette.Models;
using System.Threading.Tasks;
using Calculette.ViewModel;
using SQLiteNetExtensions.Attributes;

public class AgendaDatabase
{
    
    readonly SQLiteAsyncConnection database;

    public AgendaDatabase(string dbPath)
    {
       
        database = new SQLiteAsyncConnection(dbPath);
        database.CreateTableAsync<Agenda>().Wait();
database.CreateTableAsync<Tasks>().Wait();
    


    }

    // Get all agenda
    public Task<List<Agenda>> GetAgendasAsync()
    {

        return database.Table<Agenda>().ToListAsync();
    }

    // Get specific agenda
    public Task<Agenda> GetAgendaAsync(int id)
    {
        return database.Table<Agenda>()
                        .Where(i => i.ID == id)
                        .FirstOrDefaultAsync();
    }

    // Insert new agenda (save)
    public Task<int> SaveAgendaAsync(Agenda agenda)
    {
        if (agenda.ID != 0)
        {
            return database.UpdateAsync(agenda);
        }
        else
        {
            return database.InsertAsync(agenda);
        }
    }
    
    //Delete specific agenda
    public Task<int> DeleteAgendaAsync(Agenda agenda)
    {
        return database.DeleteAsync(agenda);
    }
    public Task<int> AddAgendaAsync(Agenda agenda)
    {
        return database.InsertAsync(agenda);
    }
}

person codejourney    schedule 29.06.2020    source источник
comment
Обязательно используйте асинхронную версию SQLiteNetExtensions и импортируйте асинхронное пространство имен. В противном случае методы расширения не будут работать, поскольку они расширяют стандартную синхронную версию.   -  person redent84    schedule 29.06.2020
comment
что это за пространство имен? Я даже не уверен, что это написано в документе, ха-ха. Также не могли бы вы помочь с примером кода, я новичок в этом, и это трудно понять одними словами, ха-ха, спасибо!   -  person codejourney    schedule 29.06.2020
comment
Конечно, в тестовой папке проекта есть несколько примеров кода: bitbucket.org/twincoders/sqlite-net-extensions/src/master/Tests/ Или проверьте другие ответы на этом же сайте, подобном этому: stackoverflow.com/a/37811309/469218   -  person redent84    schedule 29.06.2020
comment
Хорошо, спасибо за добавление этого: использование SQLiteNetExtensionsAsync.Extensions; заставил меня использовать WithChildren. Теперь поправьте меня, если я ошибаюсь, но для инициализации обеих моих таблиц я бы оставил там метод GetAgendasAsync() (он получает все повестки дня), затем я бы создал другой метод для получения всех задач, но так? public Task‹List‹Tasks›› GetAllTasks() { return database.GetAllWithChildrenAsync‹Tasks›(); } Спасибо   -  person codejourney    schedule 29.06.2020
comment
Да, это должно сделать это. В качестве примечания: я предполагаю, что ваш код является всего лишь образцом, но на всякий случай: инициализация базы данных в конструкторе класса обычно является плохой практикой.   -  person redent84    schedule 01.07.2020