7

Windows Store 응용 프로그램 (WinRT)에서 SQLite 데이터베이스를 구현하고 있습니다. 내가 뭘 잘못컬렉션 (1 : n) 관계를 만드는 방법

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

을 얻을

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

장 (N) - (n은 1) 도서 (1) 나는 두 테이블 사이의 관계에 원하는 ?

+0

오류 메시지가 더 있습니까? 아마도 예외일까요? –

+0

이 추가 정보는 내가 얻은 예외 메시지입니다 – Fixus

+0

전에 "System.Collections.Generic.List'1에 대해 몰라서"라는 오류 메시지를 본 적이 없습니다. 정확한 오류 메시지를 복사하여 붙여 넣으시겠습니까? – Bobson

답변

10

조금 더 많은 연구를 통해 제 의견을 따르십시오. 이 데이터베이스에 매핑되지 않는 것은 SQLite-net에서 지원하지 않습니다. 이유에 대해서는 here을 참조하십시오.

ORM은 .NET 클래스 정의를 사용하여 SQL 테이블 정의로 변환 할 수 있습니다. 대부분의 ORM은 다른 방향으로 이동합니다. 클래스의 모든 공용 속성을 검사하여이 작업을 수행하고 열 세부 정보를 지정하는 데 사용할 수있는 특성을 사용합니다.

당신은 다른 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

좋아,하지만 내 장부 개체의 챕터 모음이 필요합니다. 개체를 선택하는 동안 ORM에 대한 챕터를 무시하고 수동으로 채워야합니다. 흠, 그것은 SQLite의 가장 큰 부분입니다 :/ – Fixus

+0

@Fixus - SQLite-net은 사용하고 싶은 ORM이 아닙니다. 데이터베이스 작성 및 채우기는 쿼리 기능을 고려해야하기 때문에 가능합니다. SQLite 자체에는 문제가 없지만, SQLite와 통신하려면 다른 방법이 필요합니다. – Bobson

+0

@Fixus - 또한 챕터를 채울 방법을 추가했습니다. 그러나 챕터를 처리하는 좋은 방법은 아닙니다. – 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; } 
} 
관련 문제