簡體   English   中英

如何: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中編寫嵌套列表:

我的問題與我如何處理這些對象的創建有關,這與sqlite-net擴展無關。 所以我的壞!

這意味着問題示例有效且有效。 (我當然測試了它)

  • 設置數據庫的實體:
    我的問題中顯示的示例,包括Series類,Season類和Episode類,是設置它的正確方法。

  • 插入數據庫:
    如果您想知道如何插入類似於我的Series對象的對象(使用嵌套列表),請使用:
    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); } 

邊注:
該示例在類上使用帶有連接字符串的靜態屬性。 像這樣:

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

從這樣避免它是不是真的做的最好的事情,因為你應該使用using的SQLiteConnection,確保一旦你用它做它的配置。

更多信息: sqlite-net-extentions

[更新]:在sqlite-net擴展中進一步擴展處理嵌套列表:

  • 刪除帶子項的表:
    這很簡單,但無論如何我花了一個半小時計算出來。
    只需使用:
    對於列表/數組: db.DeleteAll(yourCollection, recursion: true)
    對於單個對象: db.Delete(yourObject, true);
    作為一個例子:這是我實現的一個刪除List的方法
    (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類是一個簡單的單個實體,因為它不包含子節點,所以不需要遞歸。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM