【问题标题】:SQLite-Net Extension both one-to-one and one-to-many relationships between two entitiesSQLite-Net 扩展两个实体之间的一对一和一对多关系
【发布时间】:2015-05-14 07:39:33
【问题描述】:

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

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

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

【问题讨论】:

    标签: sqlite xamarin sqlite-net sqlite-net-extensions


    【解决方案1】:

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

        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; }
        }
    

    【讨论】:

    • 感谢您的回答 @redent84 ,这正是我想要的。我只是不太确定“可以在任何类中声明 oneToMany 关系的外键”是什么意思。
    • 抱歉,打错了。我的意思是说OneToOne 属性。一对一关系的外键可以在两端任意一个。
    • 有几点需要记住: 1. 当你插入一个有关系的行时,你必须调用.UpdateWithChildren 来更新数据库中的关系。我为此奋斗了好几个小时,试图弄清楚为什么我所有的关系都被存储为 null。 2. 如果需要,不要忘记您的CascadeOperationsReadOnly 标签。
    • @JLWest 是的,您必须在插入后InsertWithChildrenUpdateWithChildren 才能更新关系。
    • @redent84 根据我的经验,InsertWithChildrenInsertOrReplaceWithChildren 不会正确更新数据库中的关系。在我打电话给UpdateWithChildren之前,我所有的关系都是空的
    猜你喜欢
    • 2022-01-05
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2018-11-18
    • 2017-06-10
    • 1970-01-01
    相关资源
    最近更新 更多