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") будет взаимодействовать со всеми отношениями, когда я часто просто хочу взаимодействовать с одной за раз. Вот несколько примеров сценариев:
Студентка "Лана" только что получила доступ к экзаменационной работе "Математика 101". Теперь, чтобы предоставить ей доступ, мне нужно загрузить; все остальные студенты с доступом, все файлы для экзамена, все разделы. В противном случае эти отношения удаляются, когда я вызываю "InsertOrReplaceWithChildren".
Я хочу узнать первый вопрос в 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 любое поле в определенной таблице.