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

C# 如何创建集合(1:n)关系,c#,sqlite,microsoft-metro,windows-runtime,windows-store-apps,C#,Sqlite,Microsoft Metro,Windows Runtime,Windows Store Apps,我正在我的Windows应用商店应用程序(WinRT)中实现SQLite数据库。 我想了解两个表之间的关系(1:n) 第(1)册-第(n)章 我做错了什么?只是为了进一步研究我的评论-SQLite net不支持任何不能直接映射到数据库的东西。有关原因,请参见: ORM能够获取.NET类定义并将其转换为SQL表定义。(大多数ORM的方向相反。)它通过检查类的所有公共属性来实现这一点,并由可用于指定列详细信息的属性来辅助 如果您正试图这样做,您可以研究使用不同的ORM来实际访问您的数据(我使用),或

我正在我的Windows应用商店应用程序(WinRT)中实现SQLite数据库。 我想了解两个表之间的关系(1:n) 第(1)册-第(n)章


我做错了什么?

只是为了进一步研究我的评论-SQLite net不支持任何不能直接映射到数据库的东西。有关原因,请参见:

ORM能够获取.NET类定义并将其转换为SQL表定义。(大多数ORM的方向相反。)它通过检查类的所有公共属性来实现这一点,并由可用于指定列详细信息的属性来辅助

如果您正试图这样做,您可以研究使用不同的ORM来实际访问您的数据(我使用),或者从类中删除
列表
,然后在
章节
类中添加
BookID
字段。数据库就是这样表示的

为了使用它,您可以将其中一个添加到类中:

List<Chapters> Chapters { 
  get { 
     return db.Query<Chapters> ("select * from Chapters where BookId = ?", this.Id); 
  } 
}
列出章节{
获取{
返回db.Query(“从BookId=?”的章节中选择*”,this.Id);
} 
}

列出章节{
获取{
返回db.Query.Where(b=>b.BookId==this.Id);
} 
}
这至少可以让您轻松地提取列表,尽管它会很慢,因为每次您访问它时它都会命中数据库。

请看一看。它通过使用反射在SQLite网上提供了复杂的关系

从站点中提取的示例:

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; }
}
公共类股票
{
[主密钥,自动增量]
公共int Id{get;set;}
[MaxLength(8)]
公共字符串符号{get;set;}
[OneToMany]//与估值的一对多关系
公共列表赋值{get;set;}
}
公共类估价
{
[主密钥,自动增量]
公共int Id{get;set;}
[ForeignKey(typeof(Stock))]//指定外键
public int StockId{get;set;}
公共日期时间{get;set;}
公共十进制价格{get;set;}
[MANYTONE]//与股票的多对一关系
公共股票{get;set;}
}

错误消息还有其他内容吗?可能是异常?这个附加信息是我得到的异常消息,我以前从未看到过错误消息“不知道System.Collections.Generic.List`1”。您确定要复制和粘贴准确的错误消息吗?@Bobson我已更新消息并粘贴了更多内容,在应用程序中断后出现异常。我在中找不到任何表示它支持表之间关系的内容。这让我相信,它只能理解直接转换为SQL列类型(int/long、float/double/decimal、string等)的基本值类型。所以我无能为力,也无法指出任何有帮助的东西。好的,但我需要我的书对象中的章节集合:)我认为我应该忽略ORM的章节,并在拾取对象时手动填充它。嗯,这是SQLite的一大缺点:/@Fixus-SQLite-net可能不是您想要使用的ORM。它似乎严格用于数据库创建和填充,查询功能是事后考虑的。SQLite本身没有问题,但您需要一种不同的方式来与它通信。@Fixus-我还添加了一种方式来填充
章节
,尽管这不是一种很好的处理方式。您能推荐一些不同的方式吗?在每一个教程中,我都会在sqlite网络上碰壁,这就是我使用它的原因。幸运的是,我可以很容易地克服这个问题,通过一点手工工作,所以在这个项目中,这不是很大的问题,但我想知道更好的解决方案,为未来。谢谢你的邀请update@Fixus-我使用Vici Coolstorage(我在回答中修复了指向它的链接),但在设置时遇到了一些问题。我听说过很多好的事情,而且总是有各种各样的答案。
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); 
  } 
}
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; }
}