7

Ich implementiere SQLite-Datenbank in meiner Windows Store-Anwendung (WinRT). Ich möchte Beziehung zwischen zwei Tabellen (1: n) Buch (1) - Kapitel (n)So erstellen Sie Sammlung (1: n) Relation

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>(); 
    } 
} 

I

-  $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 

bekommen Was mache ich falsch?

+0

Gibt es mehr zu der Fehlermeldung? Eine Ausnahme, vielleicht? –

+0

Diese zusätzliche Information ist die Nachricht der Ausnahme, die ich bekomme – Fixus

+0

Ich habe noch nie zuvor eine Fehlermeldung "Ich weiß nichts über System.Collections.Generic.List'1" gesehen. Sind Sie sicher, dass Sie die genaue Fehlermeldung kopieren und einfügen? – Bobson

Antwort

10

Nur um meinen Kommentar mit ein bisschen mehr Forschung zu verfolgen - SQLite-net unterstützt nichts, was nicht direkt auf die Datenbank zugeordnet werden kann. Siehe here warum:

Die ORM der Lage ist, eine .NET-Klassendefinition zu nehmen und wandelt es in eine SQL-Tabelle Definition. (Die meisten ORMs gehen in die andere Richtung.) Dazu werden alle öffentlichen Eigenschaften Ihrer Klassen untersucht und es werden Attribute unterstützt, mit denen Sie Spaltendetails angeben können.

Sie einen anderen ORM aussehen können in Verwendung für den Zugriff tatsächlich Ihre Daten (ich benutze Vici Coolstorage), wenn das, was Sie versuchen, die List<Chapters> von Ihrer Klasse zu tun, oder einfach zu entfernen und ein BookID Feld der hinzufügen Chapters Klasse. So würde die Datenbank es darstellen.

Für die Zwecke der Arbeit mit ihm, können Sie eine dieser Klasse hinzufügen:

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

oder

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

, dass zumindest würden Sie die Liste leicht ziehen, obwohl es würde sei langsam, weil es jedes Mal auf die Datenbank trifft, wenn du darauf zugreifst.

+0

ok, aber ich brauche die Sammlung von Kapiteln in meinem Buchobjekt :) Ich sehe, dass ich Kapitel für ORM ignorieren und es manuell füllen sollte, während ich das Objekt aufhebe. Hmm, es ist ein großes Minus von SQLite:/ – Fixus

+0

@Fixus - SQLite-net ist wahrscheinlich nicht das ORM, das Sie verwenden möchten. Es scheint ausschließlich für die Datenbankerstellung und -population zu sein, wobei Abfragefunktionen nur ein nachträglicher Einfall sind. SQLite selbst hat nicht die Probleme, aber Sie brauchen eine andere Art, damit zu kommunizieren. – Bobson

+0

@Fixus - Ich habe auch einen Weg hinzugefügt, um 'Kapitel 'zu füllen, obwohl es keine gute Möglichkeit ist, damit umzugehen. – Bobson

9

Werfen Sie einen Blick auf SQLite-Net Extensions. Es bietet komplexe Beziehungen auf SQLite-Net mit Reflektion.

Beispiel von der Website extrahiert:

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; } 
}