SQLiteNetExtensions OneToMany和ManyToOne关系不起作用

时间:2015-10-23 13:09:36

标签: c# sqlite sqlite-net sqlite-net-extensions

我遇到了SQLite-Net的问题 我有三个类:ClassA,ClassB,ClassC。 ClassA与ClassB具有OneToMany关系。 ClassB与ClassC具有ManyToOne关系。

这是我的代码

using System;
using System.Collections.Generic;
using System.Xml.Serialization;
using SQLite.Net.Attributes;
using SQLiteNetExtensions.Attributes;
using WardFlex.Core.DAL.Interfaces;

    public class ClassA : IEntity
    {
        [XmlAttribute("Id")]
        [PrimaryKey, AutoIncrement]
        public Int64 Id { get; set; }

        public string Kaka { get; set; }

        [OneToMany(CascadeOperations = CascadeOperation.All)]
        public  List<ClassB> ClassBs { get; set; }
    }


    public class ClassB : IEntity
    {
        [XmlAttribute("Id")]
        [PrimaryKey, AutoIncrement]
        public Int64 Id { get; set; }

        [ForeignKey(typeof(ClassA))]
        public Int64 ClassAId { get; set; }

        [ManyToOne]
        public  ClassA ClassA { get; set; }

        [ForeignKey(typeof(ClassC))]
        public Int64 ClassCId { get; set; }

        [ManyToOne]
        public ClassC ClassC { get; set; }
    }        

public class ClassC : IEntity
{
    [XmlAttribute("Id")]
    [PrimaryKey, AutoIncrement]
    public Int64 Id { get; set; }

    [OneToMany(CascadeOperations = CascadeOperation.All)]
    public List<ClassB> ClassBs { get; set; }
}

我保存了ClassA实体,但是 当我从ClassARepository尝试GetAllWithChildren时,我无法从ClassB看到classC实体(图像被附加) enter image description here

可能是什么问题?

提前谢谢

1 个答案:

答案 0 :(得分:0)

使用SQLite-Net,不会自动获取关系,您必须使用GetChildren方法手动获取它们,或者使用GetWithChildren标志设置为true的任何recursive方法加载整个模型树。

查看Integration Tests Project中的RecursiveReadTestsRecursiveWriteTests个文件,了解样本。

更新:您尚未将ClassB ManyToOne关系的递归政策设置为ClassC。尝试添加CascadeOperationsFlag以处理递归操作:

[ManyToOne(CascadeOperations = CascadeOperation.All)]
public ClassC ClassC { get; set; }

对于手动保存的关系,仅使用CascadeRead操作或将ReadOnly模式设置为true也是一个好主意。例如,ClassBs ClassC属性不需要任何写入操作:

[OneToMany(ReadOnly = true)]
public List<ClassB> ClassBs { get; set; }

这样可以避免在保存未设置属性时保存ClassC个对象可能会删除关系的问题。