7

मैं अपने विंडोज स्टोर एप्लिकेशन (विनआरटी) में SQLite डेटाबेस को कार्यान्वित कर रहा हूं। अध्याय (एन)संग्रह कैसे बनाएं (1: एन) संबंध

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

मैं

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

क्या मैं गलत कर रहा हूँ मिल -: (एन 1) बुक (1) मैं दो तालिकाओं के बीच संबंध करना चाहते हैं?

+0

वहाँ त्रुटि संदेश के लिए और अधिक है? एक अपवाद, शायद? –

+0

यह अतिरिक्त जानकारी अपवाद का संदेश है कि मुझे – Fixus

+0

मिल गया है मैंने कभी भी त्रुटि संदेश नहीं देखा है "सिस्टम के बारे में नहीं पता। चयन। जेनरिक.लिस्ट'1" पहले। क्या आप वाकई सटीक त्रुटि संदेश की प्रतिलिपि बना रहे हैं और पेस्ट कर रहे हैं? – Bobson

उत्तर

10

थोड़ा और अधिक शोध के साथ मेरी टिप्पणी पर अनुवर्ती करने के लिए - SQLite-net कुछ भी समर्थन नहीं करता है जो सीधे डेटाबेस में मैप किया जा सकता है। क्यों के लिए here देखें:

ORM एक .NET वर्ग परिभाषा लेने के लिए और यह एक एसक्यूएल तालिका परिभाषा को बदलने में सक्षम है। (अधिकांश ओआरएम दूसरी दिशा में जाते हैं।) यह आपके वर्गों के सभी सार्वजनिक गुणों की जांच करके करता है और उन गुणों द्वारा सहायता प्राप्त की जाती है जिनका उपयोग आप कॉलम विवरण निर्दिष्ट करने के लिए कर सकते हैं।

आप एक अलग ORM का उपयोग कर पर गौर कर सकते करने के लिए वास्तव में आपके डेटा (मैं Vici Coolstorage का उपयोग करें) का उपयोग, कि अगर बस अपने वर्ग से List<Chapters> हटाने और करने के लिए एक BookID क्षेत्र को जोड़ने तुम क्या करने की कोशिश कर रहे हैं, या है Chapters कक्षा। इस प्रकार डेटाबेस इसका प्रतिनिधित्व करेगा।

इसके साथ काम करने के प्रयोजनों के लिए, आप अपने वर्ग के लिए इनमें से किसी एक जोड़ सकते हैं:

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

या

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

कि कम से कम आप आसानी से सूची खींच करते हैं, हालांकि यह होगा धीमा हो क्योंकि हर बार जब आप इसे एक्सेस करते हैं तो डेटाबेस को हिट करता है।

+0

ठीक है लेकिन मुझे अपनी पुस्तक ऑब्जेक्ट में अध्यायों के संग्रह की आवश्यकता है :) मुझे लगता है कि मुझे ओआरएम के लिए अध्यायों को अनदेखा करना चाहिए और वस्तु को उठाते समय इसे मैन्युअल रूप से पॉप्युलेट करना चाहिए। हम्म यह SQLite का एक बड़ा ऋण है:/ – Fixus

+0

@ फ़िक्सस - SQLite-net शायद ओआरएम नहीं है जिसका आप उपयोग करना चाहते हैं। ऐसा लगता है कि डेटाबेस निर्माण और आबादी के लिए कड़ाई से प्रतीत होता है, जिसमें क्वेरी फीचर्स एक विचारधारा है। SQLite के पास समस्याएं नहीं हैं, लेकिन इसके साथ संवाद करने के लिए आपको एक अलग तरीके की आवश्यकता है। – Bobson

+0

@ फ़िक्सस - मैंने 'अध्याय' को पॉप्युलेट करने का एक तरीका भी जोड़ा, हालांकि इसे संभालने का यह एक अच्छा तरीका नहीं है। – Bobson

9

SQLite-Net Extensions पर एक नज़र डालें। यह प्रतिबिंब का उपयोग करके SQLite-Net के शीर्ष पर जटिल संबंध प्रदान करता है।

उदाहरण साइट से निकाला:

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; } 
} 
संबंधित मुद्दे