7

Windows Mağazası uygulamasında (WinRT) SQLite veritabanını uygularım. Ben yanlış yapıyorumtoplama (1: n) ilişkisi oluşturma

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

olsun

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

Bölüm (n): - (n 1) Kitap (1) iki tablo arasındaki ilişki istiyor ?

+0

hata mesajına Dahası var mı? Bir istisna, belki de? –

+0

Bu ek bilgi, – Fixus

+0

olsun istisna mesajıyla ilgili daha önce hiç bir zaman "System.Collections.Generic.List'1 hakkında bilmiyorum" hata mesajını görmedim. Tam hata mesajını kopyalayıp yapıştırdığınızdan emin misiniz? – Bobson

cevap

10

Sadece biraz daha fazla araştırmayla yaptığım yorumu takip et - SQLite-net, veri tabanına eşlenemeyen hiçbir şeyi desteklemiyor. Neden here için bkz .:

ORM, bir .NET sınıf tanımı alabilir ve bir SQL tablo tanımına dönüştürebilir. (Çoğu ORM diğer yöne gider.) Bunu, sınıflarınızın tüm genel özelliklerini inceleyerek yapar ve sütun ayrıntılarını belirtmek için kullanabileceğiniz özniteliklere yardımcı olur.

Farklı ORM kullanarak içine bakabilirsiniz

aslında verilerinizi (I Vici Coolstorage kullanın) erişmek, yani yapmaya çalıştığını, ya da sadece sınıfından List<Chapters> kaldırıp bir BookID alan eklemek buysa Chapters sınıfı. Veri tabanı bunu nasıl temsil edecek? Her ne kadar iyi giderdi,

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

veya

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

en azından kolayca listeyi çekin izin verir: onunla çalışmak amaçları için

, size sınıf bunlardan birini ekleyebilir yavaş olun, çünkü veritabanına her eriştiğinizde ulaşır.

+0

tamam ama Kitap nesnesinde bölümler koleksiyonuna ihtiyacım var :) ORM için bölümleri göz ardı etmem ve nesneyi toplarken elle doldurmam gerektiğini görüyorum. Hmm, SQLite'nin büyük bir eksi:/ – Fixus

+0

@Fixus - SQLite-net muhtemelen kullanmak istediğiniz ORM değildir. Veri tabanı oluşturma ve popülasyon için, sorgu özelliklerinden sonradan gelen bir şey olduğu kesin. SQLite'nin sorunları yok, ancak bununla iletişim kurmanın farklı bir yoluna ihtiyacınız var. – Bobson

+0

@Fixus - Ayrıca, 'Chapters''ı doldurmanın bir yolunu da ekledim, ancak bununla başa çıkmak için harika bir yol değil. – Bobson

9

SQLite-Net Extensions'a bir göz atın. Yansıma kullanarak SQLite-Net üstüne karmaşık ilişkiler sağlar. siteden çıkarılan

Örnek:

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