SqliteNetExtensions можно ли игнорировать указанный дочерний элемент при вызове InsertOrReplaceWithChildren()?

Я создаю мобильное приложение в xamarin, которое имеет много связей между классами. Для простоты рассмотрим приложение "Университет", в котором есть классы: ExamPapers, Студенты, ExamAnswers.

Класс ExamPaper будет выглядеть следующим образом

public class ExamPapers {
    [ManyToMany(typeof(Student_ExamPaper))]
    public List<Student> Students { get; set; }

    [OneToMany]
    public List<ExamAnswers> Files { get; set; }

    [OneToMany(CascadeOperations = CascadeOperation.All)]
    public List<ExamSection> Sections { get; set; }

    public string ExamName { get; set; }

    [PrimaryKey]
    public string Id { get; set; }
}

Так что в настоящий момент любая операция sqlitenetextension (те, которые заканчиваются на "WithChildren") будет взаимодействовать со всеми отношениями, когда я часто просто хочу взаимодействовать с одной за раз. Вот несколько примеров сценариев:

  1. Студентка "Лана" только что получила доступ к экзаменационной работе "Математика 101". Теперь, чтобы предоставить ей доступ, мне нужно загрузить; все остальные студенты с доступом, все файлы для экзамена, все разделы. В противном случае эти отношения удаляются, когда я вызываю "InsertOrReplaceWithChildren".

  2. Я хочу узнать первый вопрос в ExamPaper. Я называю "GetWithChildren(examId)". Теперь у меня есть объект с большим количеством информации, которую я не хочу (например, 300 студентов и 300 экзаменационных ответов).

Извините, если я пропустил что-то релевантное в документации, но я прочитал это пару раз. https://bitbucket.org/twincoders/sqlite-net-extensions

Благодарю.

0 ответов

Ответьте на ваш вопрос в заголовке: Нет. Не можете.
SQLite-Net-Extensions не предоставляет такого гибкого API для управления связанными данными.

Но есть одна полезная вещь, которую можно использовать в конкретных случаях:

Вы можете работать с соединительными таблицами как с простыми таблицами с помощью методов SQLite-Net (методы без *WithChildren postfix), если таблицы соединений имеют PrimaryKey (Id).
Например, если у вас есть какие-либо данные, которые вы хотите получить вместе с дополнительными (связанными) данными, просто позвонитеTable</*class*/>() метод на конкретной таблице с Where(/*your condition*/)пункт для получения только тех данных, которые вам действительно нужны. Затем вы можете сохранить измененные данные черезUpdate метод.

К сожалению, это не сработает с обновлением отношений (например, если вы хотите переместить одинExamAnswer от ExamPaper к другому ExamPaper объект), потому что все атрибуты SQLite-Net-Extensions унаследованы от IgnoreАтрибут SQLite-Net, который игнорируется во всех операциях SQLite-Net.
Но есть еще один обходной путь (немного хакерский): вы можете указать второй класс без каких-либо атрибутов SQLite-Net-Extensions, и это предоставит вам CRUD любое поле в определенной таблице.

Другие вопросы по тегам