9

Windowsストアアプリケーション(WinRT)にSQLiteデータベースを実装しています。2つのテーブルを関連付けたい(1:n)本(1)-章(n)

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

私は何を間違っているのですか?

4

2 に答える 2

10

もう少し調査して私のコメントをフォローアップするために-SQLite-netは、データベースに直接マップできないものをサポートしていません。理由については、こちらを参照してください。

ORM は、.NET クラス定義を取得して、それを SQL テーブル定義に変換できます。(ほとんどの ORM は逆方向です。) これは、クラスのすべてのパブリック プロパティを調べることによって行われ、列の詳細を指定するために使用できる属性によって支援されます。

別の ORM を使用して実際にデータにアクセスすることを検討することもできます (私はVici Coolstorageを使用していますList<Chapters>) 。それがデータベースがそれを表す方法です。BookIDChapters

それを操作するために、次のいずれかをクラスに追加できます。

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

アクセスするたびにデータベースにヒットするため、遅くなりますが、少なくともリストを簡単に取得できます。

于 2012-10-31T00:18:44.910 に答える