如何创建集合(1:n)关系

时间:2012-10-30 18:38:31

标签: c# sqlite microsoft-metro windows-runtime windows-store-apps

我正在Windows Store应用程序(WinRT)中实现SQLite数据库。 我想要两个表之间的关系(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

我做错了什么?

2 个答案:

答案 0 :(得分: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); 
  } 
}

这至少可以让你轻松地提取列表,虽然它会很慢,因为它每次访问时都会访问数据库。

答案 1 :(得分: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; }
}