SQLite-Net 扩展两个实体之间的一对一和一对多关系

SQLite-Net Extension both one-to-one and one-to-many relationships between two entities

我正在使用 SQLite-Net PCL 和 SQLite-Net 扩展一起使用 Xamarin 开发应用程序。

在我的模型中,我有两个实体,我们称它们为 A 和 B,它们通过一对一和一对多关系连接。比如A和B是一对一的关系,A和B也是一对多的关系。

是否可以使用 SQLite-Net 扩展来表达这种行为?

是的,但是您必须在关系属性中显式声明外键和反向属性,否则库可能会得到错误的关系外键。

    public class ClassA
    {
        [PrimaryKey, AutoIncrement]
        public int Id { get; set; }

        [OneToMany("O2MClassAKey", "BObjectsInverse")]
        public List<ClassB> BObjects { get; set; }

        [OneToOne("O2OClassAKey", "BObjectInverse")]
        public ClassB BObject { get; set; }

        // Other properties
        public string Bar { get; set; }
    }
        
    public class ClassB
    {
        [PrimaryKey, AutoIncrement]
        public int Id { get; set; }

        [ForeignKey(typeof (ClassA))]
        public int O2MClassAKey { get; set; }

        [ForeignKey(typeof (ClassA))]
        public int O2OClassAKey { get; set; }

        // Inverse relationships, these are optional
        [ManyToOne("O2MClassAKey", "BObjects")]
        public ClassA BObjectsInverse { get; set; }
        [OneToOne("O2OClassAKey", "BObject")]
        public ClassA BObjectInverse { get; set; }

        // Other properties
        public string Foo { get; set; }
    }

请注意 OneToOne 关系的外键 O2OClassAKey 可以在任何 类.

中声明

如果不需要逆向属性,可以在关系属性中跳过:

    public class ClassA
    {
        [PrimaryKey, AutoIncrement]
        public int Id { get; set; }

        [OneToMany("O2MClassAKey")]
        public List<ClassB> BObjects { get; set; }

        [OneToOne("O2OClassAKey")]
        public ClassB BObject { get; set; }

        // Other properties
        public string Bar { get; set; }
    }
        
    public class ClassB
    {
        [PrimaryKey, AutoIncrement]
        public int Id { get; set; }

        [ForeignKey(typeof (ClassA))]
        public int O2MClassAKey { get; set; }

        [ForeignKey(typeof (ClassA))]
        public int O2OClassAKey { get; set; }

        // Other properties
        public string Foo { get; set; }
    }