【问题标题】:How to: Nested Lists in SQLite-Net Extensions如何:SQLite-Net 扩展中的嵌套列表
【发布时间】:2016-03-21 03:24:22
【问题描述】:

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

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

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

问题在于 BaseSeason。
它只会插入一个 Season 对象,它(由于某种原因)是 Series 中 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 中的嵌套关​​系有经验,知道如何进行这项工作或看看我做错了什么?

【问题讨论】:

    标签: c# sqlite sqlite-net-extensions


    【解决方案1】:

    所以关于在 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);
      举个例子:这是我对删除列表的方法的实现
      (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 类是一个简单的单一实体,不需要递归,因为它不包含子实体。

    【讨论】:

    • Generic Repository RemoveCollection() 需要专门模型类及其内部结构的知识,这似乎违反直觉。
    猜你喜欢
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    • 2015-04-13
    • 2015-11-30
    • 2021-01-20
    相关资源
    最近更新 更多