SqliteNetExtensions是否可以在调用InsertOrReplaceWithChildren()时忽略指定的子级?

时间:2018-12-12 09:19:11

标签: c# sqlite-net-extensions

我正在xamarin中构建一个移动类,该类之间存在很多关系。为简单起见,请将其视为具有以下类的“大学”应用程序:ExamPapers,Students,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. 学生“ Lana”刚刚被授予访问ExamPaper“ Mathematics 101”的权限。现在要授予她访问权限,我需要加载;具有访问权限的所有其他学生,考试的所有文件,所有部分。否则,当我调用“ InsertOrReplaceWithChildren”时,这些关系将被删除。

  2. 我想在ExamPaper中找到第一个问题。我称之为“ GetWithChildren(examId)”。我现在有了一个不需要很多信息的对象(例如300名学生和300名ExamAnswers)。

很抱歉,如果我错过了文档中的相关内容,但现在已经阅读了好几次。 https://bitbucket.org/twincoders/sqlite-net-extensions

谢谢。

1 个答案:

答案 0 :(得分:0)

回答标题中的问题:否。你不能。
SQLite-Net-Extensions没有提供用于处理相关数据的灵活API。

但是在特定情况下可以使用一件事:

如果联结表具有PrimaryKey(*WithChildren),则可以通过SQLite-Net方法(没有Id后缀的方法)将联结表作为简单表使用。
例如,如果您有任何数据想要与其他(相关)数据一起获取,则只需使用Table</*class*/>()子句在特定表上调用Where(/*your condition*/)方法即可仅获取您真正需要的数据。然后,您可以通过Update方法保存修改后的数据。

不幸的是,此问题不适用于关系 update (例如,如果您要将一个ExamAnswerExamPaper移动到另一个ExamPaper对象)因为所有SQLite-Net-Extensions属性都继承自Ignore SQLite-Net属性,而在所有SQLite-Net操作中都将忽略该属性。
但是还有另一种解决方法(有点怪异),您可以指定第二类而不使用任何SQLite-Net-Extensions属性,并且可以为特定表中的任何字段提供CRUD。