如何:SQLite-Net 扩展中的嵌套列表

How to: Nested Lists in SQLite-Net Extensions

如何:在 sqlite-net-extensions 中做嵌套列表
找到答案:以问题为例说明如何做。
我遇到的问题与sqlite-net-extensions无关,但我保留了上下文的问题。

[老问题] 我遇到了 TwinCoders SQLite-net 扩展的问题。
我正在尝试将一个 Series 对象插入到我的数据库中:

我正在使用 Db.InsertWithChildren(SelectedSeriesObject,recursive:true) 方法。
相应地添加了 Series 对象及其属性。
所有剧集也已添加,没有问题。

问题是 BaseSeason。
它只会插入一个 Season 对象,这是(出于某种原因)系列中 Seasons 列表的最后一个 Season 对象

public class BaseSeries : BaseMedia
{
[PrimaryKey, AutoIncrement]
public int Id { get; set; }

[Indexed]
public int ShowId { get; set; }

public string FirstAirDate { get; set; }
public string LastAirDate { get; set; }
public string Status { get; set; }

[OneToMany(CascadeOperations = CascadeOperation.All)]
public List<BaseSeason> Seasons { get; set; }
/// <summary>
/// TvShow = 0, Anime = 1
/// </summary>
public int SeriesType { get; set; }

}

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

[ForeignKey(typeof(BaseSeries))]
public int SeasonId { get; set; }

public int SeasonNumber { get; set; }
public int NumberOfEpisodes { get; set; }
public string Plot { get; set; }
public string Poster { get; set; }
public string AirDate { get; set; }

[OneToMany(CascadeOperations = CascadeOperation.All)]
public List<BaseEpisode> Episodes { get; set; }    
[ManyToOne]
public BaseSeries BaseSeries { get; set; }

}

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

[ForeignKey(typeof(BaseSeason))]
public int EpisodeId { get; set; }

public string Title { get; set; }
public string Plot { get; set; }
public string Poster { get; set; } //still path
public string AirDate { get; set; }
public int EpisodeNumber { get; set; }
public int SeasonNumber { get; set; }
public string SeriesName { get; set; }    

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

是否有人对 sqlite-net-extensions 中的嵌套关​​系有经验,知道如何进行这项工作或看看我做错了什么?

因此关于在 sqlite-net-extensions 中编写嵌套列表:

我的问题原来与我如何处理这些 object 的创建有关,这与 sqlite-net 扩展无关。所以我的坏!

这意味着问题示例有效且有效。 (我当然测试过了)

  • 正在为数据库设置实体:
    我的问题中显示的示例包含系列 class、季 class 和剧集 class,是设置它的正确方法。

  • 正在插入数据库:
    如果您想知道如何插入类似于我的系列 object(带嵌套列表)的 object,请使用:
    db.InsertWitchChildren(yourObject, recursion: true)
    这是一个扩展示例:

    public void AddSeries()
    {            
        MediaDB.db.CreateTable<BaseSeries>();
        MediaDB.db.CreateTable<BaseSeason>();
        MediaDB.db.CreateTable<BaseEpisode>();
    
        MediaDB.db.InsertWithChildren(SelectedSeries, recursion: true);            
    }
    

旁注:
该示例在 class 上使用带有连接字符串的静态 属性。像这样:

    public class MediaDB
    {
        public static SQLiteConnection db => new SQLiteConnection(new SQLitePlatformGeneric(),"Media.db");
    }

不要这样做这并不是最好的做法,因为您应该对 SQLiteConnection 使用 using,确保一旦您完成它。

更多信息:sqlite-net-extentions

[更新]:在 sqlite-net 扩展中进一步扩展处理嵌套列表:

  • 删除表 children:
    这很简单,但我还是花了一个半小时弄明白了。
    只需使用:
    对于 lists/arrays:db.DeleteAll(yourCollection, recursion: true)
    对于单个 objects:db.Delete(yourObject, true);
    举个例子:这是我实现的一个删除 List
    的方法 (BaseSeries就是原题题中显示的class):

    public static void RemoveCollection<T>(List<T> collection)
    {
        using (db)
        {
            if (typeof(T) == typeof(BaseMovie))
            {
                db.DeleteAll(collection);
            }
    
            if (typeof(T) == typeof(BaseSeries))
            {
                db.DeleteAll(collection, recursion: true);
            }
        }
    }
    

    BaseMovie class 是一个简单的单一实体,不需要递归,因为它不包含 children.