7

Implementuję bazę danych SQLite w mojej aplikacji Windows Store (WinRT). Chcę relacji między dwiema tabelami (1: n) Book (1) - rozdział (N)jak utworzyć kolekcję (1: n) relacja

class Book 
{ 
    [SQLite.AutoIncrement, SQLite.PrimaryKey] 
    public int Id { get; set; } 
    public String Title { get; set; } 
    public String Description { get; set; } 
    public String Author { get; set; } 
    public List<Chapter> Chapters { get; set; } 

    public Book() 
    { 
     this.Chapeters = new List<Chapter>(); 
    } 
} 

dostaję

-  $exception {"Don't know about  System.Collections.Generic.List`1[Audioteka.Models.Chapter]"} System.Exception {System.NotSupportedException} 

+  [System.NotSupportedException] {"Don't know about System.Collections.Generic.List`1[Audioteka.Models.Chapter]"} System.NotSupportedException 

+  Data {System.Collections.ListDictionaryInternal} System.Collections.IDictionary {System.Collections.ListDictionaryInternal} 
    HelpLink null string 
    HResult -2146233067 int 
+  InnerException null System.Exception 
    Message "Don't know about System.Collections.Generic.List`1[Audioteka.Models.Chapter]" string 

Co robię źle?

+0

Czy istnieje bardziej w błędzie? Być może wyjątek? –

+0

Ta dodatkowa informacja jest komunikatem wyjątku, który dostaję – Fixus

+0

Nigdy wcześniej nie widziałem komunikatu o błędzie "Nie wiem o System.Collections.Generic.List'1" wcześniej. Czy na pewno kopiujesz i wklejasz dokładny komunikat o błędzie? – Bobson

Odpowiedz

10

Tylko po to, aby kontynuować mój komentarz z nieco więcej badań - SQLite-net nie obsługuje niczego, co nie może być bezpośrednio zmapowane do bazy danych. Zobacz: here, dlaczego:

ORM może przyjąć definicję klasy .NET i przekonwertować ją do definicji tabeli SQL. (Większość ORM kieruje się w drugą stronę.) Robi to, badając wszystkie publiczne właściwości twoich klas i jest wspomagana przez atrybuty, których możesz użyć do określenia szczegółów kolumny.

Możesz zajrzeć na użyciu innego ORM faktycznie dostęp do danych (używam Vici Coolstorage), jeśli to, co próbujesz robić, albo po prostu usunąć List<Chapters> ze swojej klasy i dodać pole BookID do Chapters klasa. Tak będzie wyglądała baza danych.

Dla celów pracy z nim, można dodać jeden z nich do swojej klasie:

List<Chapters> Chapters { 
    get { 
    return db.Query<Chapters> ("select * from Chapters where BookId = ?", this.Id); 
    } 
} 

lub

List<Chapters> Chapters { 
    get { 
    return db.Query<Chapters>.Where(b => b.BookId == this.Id); 
    } 
} 

To by przynajmniej niech wyciągnąć listę łatwo, chociaż miałoby to być powolnym, ponieważ trafia do bazy danych za każdym razem, gdy uzyskujesz do niej dostęp.

+0

ok ale potrzebuję kolekcji rozdziałów w moim obiekcie Book :) Rozumiem, że powinienem zignorować rozdziały dla ORM i wypełnić je ręcznie podczas podnoszenia obiektu. Hmm, to duży minus SQLite:/ – Fixus

+0

@Fixus - SQLite-net prawdopodobnie nie jest ORMem, którego chcesz używać. Wydaje się, że jest to wyłącznie tworzenie bazy danych i populacja, a funkcje zapytań to refleksja. Sam SQLite nie ma problemów, ale potrzebujesz innego sposobu komunikowania się z nim. – Bobson

+0

@Fixus - Dodałem także sposób na wypełnianie 'Chapters', chociaż nie jest to świetny sposób, aby sobie z tym poradzić. – Bobson

9

Spójrz na SQLite-Net Extensions. Zapewnia złożone relacje na bazie SQLite-Net za pomocą refleksji.

Przykład ekstrakcji ze strony:

public class Stock 
{ 
    [PrimaryKey, AutoIncrement] 
    public int Id { get; set; } 
    [MaxLength(8)] 
    public string Symbol { get; set; } 

    [OneToMany]  // One to many relationship with Valuation 
    public List<Valuation> Valuations { get; set; } 
} 

public class Valuation 
{ 
    [PrimaryKey, AutoIncrement] 
    public int Id { get; set; } 

    [ForeignKey(typeof(Stock))]  // Specify the foreign key 
    public int StockId { get; set; } 
    public DateTime Time { get; set; } 
    public decimal Price { get; set; } 

    [ManyToOne]  // Many to one relationship with Stock 
    public Stock Stock { get; set; } 
} 
Powiązane problemy