作法:在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)!