当前位置:首页 > 数据库 > SQlite

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

作法:在sqlite-net-extensions中进行巢状清单
找到答案:以问题为例.
我遇到的问题与sqlite-net-extensions不相关,但我将问题保留在上下文中.

[旧问题]
我对TwinCoders SQLite-net扩展有问题.
我正在尝试将Series对象插入数据库中:

我正在使用Db.InsertWithChildren(SelectedSeriesObject,recursive:true)方法.
相应地,将Series对象及其属性添加到其中.
所有的情节也都被添加了,没有问题.

问题是BaseSeason.
它将仅插入一个Season对象,该对象是(出于某种原因)Series系列列表中的最后一个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中编写嵌套列表:

我的问题原来与我处理这些对象的方式有关,而与sqlite-net扩展无关.所以我不好!

这意味着问题示例有效且可行. (我当然测试过)

>设置数据库实体:
我的问题中显示的带有Seri??es类,Season类和Episode类的示例是设置它的正确方法.
>插入数据库:
如果您想知道如何插入类似于我的Series对象(带有嵌套列表)的对象,请使用:
db.InsertWitchChildren(yourObject,递归:true)
这是一个扩展的示例:

public void AddSeries()
{            
    MediaDB.db.CreateTable<BaseSeries>();
    MediaDB.db.CreateTable<BaseSeason>();
    MediaDB.db.CreateTable<BaseEpisode>();

    MediaDB.db.InsertWithChildren(SelectedSeries, recursion: true);            
}

边注:
该示例对带有连接字符串的类使用静态属性.像这样:

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

不要这样做,实际上并不是最好的事情,因为您应该对SQLiteConnection使用use,确保一旦完成就将其丢弃.

有关更多信息:sqlite-net-extentions

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

>删除带孩子的桌子:
这很简单,但是无论如何我花了一个半小时弄清楚了.
只需使用:
对于列表/数组:db.DeleteAll(yourCollection,递归:true)
对于单个对象:db.Delete(yourObject,true);
例如:这是我将删除列表的方法的实现
(BaseSeries是原始问题中显示的类):

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类是一个简单的单个实体,因为它不包含任何子代,所以不需要递归.


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!