【问题标题】:Delete operation with foreign key reference in sqlite xamarin forms在 sqlite xamarin 表单中使用外键引用删除操作
【发布时间】:2017-10-16 20:08:35
【问题描述】:

我在sqlite中有三个模型(表)如下:

public class Program
{
    [PrimaryKey, AutoIncrement]
    public int ProgramId { get; set; }
    public string Name { get; set; }
}

public class Training
{
    [PrimaryKey, AutoIncrement]
    public int TrainingId { get; set; }

    [ForeignKey(typeof(Program))]
    public int ProgramId { get; set; }

}

public class Instructor 
{
    [PrimaryKey, AutoIncrement]
    public int InstructorId { get; set; }

    [ForeignKey(typeof(Program))]
    public int ProgramId { get; set; }

}

我在 Training 和 Instructor 表中有两个外键 ProgramId,它们引用 Program 表中的主键 ProgramId。我想在ProgramId == 1 的表程序中进行删除操作,并且我希望这个删除操作在两个相应的表Training and Instructor 中也受到影响。如何使用 xamarin 表单在 sqlite 中实现这一点?

请指教。谢谢。

【问题讨论】:

    标签: c# sqlite xamarin.forms


    【解决方案1】:

    你说的是级联操作。

    标准的 SQLite-net 包(我假设你正在使用这个)还没有这个功能,但你可以使用 sqlite-net-extensions package 来实现。

    您要做的唯一更改是在您的主类上,它需要声明您想要在级联上执行删除的相关类。它会变成这样:

    public class Program
    {
        [PrimaryKey, AutoIncrement]
        public int ProgramId { get; set; }
        public string Name { get; set; }
    
        [OneToMany(CascadeOperations = CascadeOperation.CascadeDelete)]
        public Training[] Trainings {get; set; }
    
        [OneToMany(CascadeOperations = CascadeOperation.CascadeDelete)]
        public Instructor[] Instructors {get; set; }
    }
    

    它可能会成功。 希望对你有帮助。

    【讨论】:

    • 为什么是 Training[]Instructor[] ?如果我使用var prog = con.GetWithChildren<Program>(ProgramId); con.Delete(prog, true);,它是否也会删除其他两个表中的记录?
    • 1 - 这是在 SQLite-net-extensions 包上定义级联操作所需的符号。请阅读我在答案中发布的链接中提到的文档,以获取有关其符号和功能的更多信息; 2 - 如果您不使用符号并进行我建议的更改,那么您不会有任何改变。方法名称上的Children 部分由TrainingsInstructors 属性上的那些属性推断。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多