0

我对 SQLite-Net 有疑问我有三个类:ClassA、ClassB、ClassC。ClassA 与 ClassB 具有 OneToMany 关系。ClassB 与 ClassC 具有多对一关系。

这是我的代码

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 实体(已附加图像) 在此处输入图像描述

可能是什么问题呢??

先感谢您

4

1 回答 1

0

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

查看集成测试项目RecursiveReadTests中的和RecursiveWriteTests文件以获取示例。

更新:您尚未将递归策略设置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在保存未设置的属性时保存对象可能会删除关系的问题。

于 2015-10-23T15:52:00.290 回答