2016-03-20 3 views
2

Как: Есть ли вложенные списки в SQLite-нетто-расширений
Ответ Найдено: Держа вопрос в качестве примера того, как это сделать.
Проблема, с которой я столкнулся, не связана с расширением sqlite-net-extensions, но я сохраняю вопрос для контекста.Как: Вложенные списки в SQLite-Net Extensions

[Старый Вопрос] У меня есть проблемы с TwinCoders SQLite внутрисетевых расширений.
Я пытаюсь вставить объект серии в моей базе данных:

Я использую метод Db.InsertWithChildren(SelectedSeriesObject,recursive:true).
Объект Series добавляется соответственно его атрибутами.
Все Эпизоды также добавлены, никаких проблем нет.

Проблема в BaseSeason.
Это будет только вставить один сезон объект, который (по некоторым причинам) в прошлом сезоне Объект списка сезонов в серии

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- расширения, которые знают, как сделать эту работу или посмотреть, что я сделал неправильно?

Intended Relation

ответ

2

Так о написании вложенных списков в SQLite-нетто-расширений:

Моя проблема Оказалось, что связано с тем, как я справиться с созданием этих объектов, это не является ни в средства, связанные с расширениями sqlite-net. Так что я плохой!

Это означает, что пример вопросов действителен и работает. (Я проверил это, конечно)

  • Настройка объектов для базы данных:
    Пример, показанный на мой вопрос, с классом серии, сезон класса и Episode класса, это правильный способ установки это вверх.

  • Вставка в базу данных:
    Если вы задаетесь вопросом, как вставить объект, похожий на мой объект серии (с вложенными списками), использование:
    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);    
    } 
    

Side Примечание:
пример использует статическое свойство класса с строкой соединения.Как так:

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

Воздерживаться от делать это самом деле это не самое лучшее, что можно сделать, так как вы должны использовать using для SQLiteConnection, убедившись, что он расположен, как только вы сделали с ним.

подробнее о: sqlite-net-extentions

[UPDATE]: Дальнейшее расширение обработки вложенных списков в SQLite внутрисетевые расширений:

  • Удаление таблиц с детьми:
    Это довольно простой, но я потратил хороший час и половину, выясняя это в любом случае.
    Просто используйте:
    Для списков/массивы: db.DeleteAll(yourCollection, recursion: true)
    Для отдельных объектов: db.Delete(yourObject, true);
    Как exmaple: вот моя реализация метода, который будет удалить список
    (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 простой единое целое, рекурсия не требуется, так как он не имеет детей.