0

我正在努力使用 SQLite.Net Async PCL 的异步 API 按 ID 获取项目。这是我的模型课

public class Invoice : IEntityBase
{
    public Invoice()
    {
        LineItems = new List<LineItem>();
        DateCreated = DateTime.Now;                
    }

    [PrimaryKey, AutoIncrement, Column("_id")]
    public int Id { get; set; }
    public DateTime DateCreated { get; set; }
    public int Term { get; set; }
    public bool Paid { get; set; }
    public decimal Total { get; set; }
    public string Notes { get; set; }

    [OneToMany(CascadeOperations = CascadeOperation.All)] 
    public List<LineItem> LineItems { get; set; }    

}

以及此处具有一对多关系的 LineItems

[PrimaryKey, AutoIncrement, Column("_id")]
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public decimal Price { get; set; }
public string Category { get; set; }
public int Qty { get; set; }

[ForeignKey(typeof(Invoice))]
public int InvoiceId { get; set; }

[ManyToOne]
public Invoice Invoice { get; set; }

这是构造函数:

public SQLiteAsyncConnection DbConnection;

public InvoiceDatabase(ISQLitePlatform platform, string databasePath)
{
    if (DbConnection == null)
    {
        var connectionAsync = new Func<SQLiteConnectionWithLock>(() =>
                new SQLiteConnectionWithLock
                    (
                        platform,
                        new SQLiteConnectionString(databasePath, false) 
                    )
                );
        DbConnection = new SQLiteAsyncConnection(connectionAsync);
        DbConnection.CreateTableAsync<Invoice>();                    
        DbConnection.CreateTableAsync<LineItem>();                                  
    }             
}

除了按 ID 获取发票外,其他 CRUD 方法(插入、GetALL)都在工作,而且 Visual Studio 和 Xamarin Studio 都没有给我任何有用的堆栈跟踪。

这是获取方法

private readonly InvoiceDatabase _database;

public InvoiceRepository(ISQLitePlatform platform, string databasePath)
{
    if (_database == null)
    {
        _database = new InvoiceDatabase(platform, databasePath);
    }
}

public async Task<Invoice> GetInvoice(int id)
{
    var result = await _database.DbConnection.Table<Invoice>()
                            .Where(t => t.Id == id)
                            .FirstOrDefaultAsync();
    return result;
}

我正在传递 SQLite 的 Android 实现,就像我说创建了数据库但我无法取回 Invoice 对象一样,我什至尝试过

public Task<Invoice> GetInvoiceWithChildren(int id)
{
    return _database.DbConnection.GetWithChildrenAsync<Invoice>(id);
}

任何帮助将不胜感激。

4

1 回答 1

3

经过三天的追逐阴影,结果证明这只是一件非常简单的事情让我绊倒。我想像这样保存一个对象列表

[OneToMany(CascadeOperations = CascadeOperation.All)] 
public List<LineItem> LineItems { get; set; }  

我错过了文档中重复 SQLite.Net 是一个轻量级 ORM 的事实的部分——这一点不能得到足够的强调,所以你必须删除你的全尺寸 ORM 帽子,比如 EF。因此,在阅读了 SQLite-Net Extension 文档之后

文本块状属性 文本块状属性在保存时被序列化为文本属性,并在加载时被反序列化。这允许将简单对象存储在同一表中的单个列中。Text-blobbed 属性在序列化和反序列化对象方面有少量开销和一些限制,但它是存储简单对象(如基本类型或简单关系的 List 或 Dictionary)的最佳方式。

我像这样改变了我的财产,现在一切都按预期工作。现在开始处理 Async 和 Await 的细微差别

[TextBlob("LineItemBlobbed")]
public List<LineItem> LineItems { get; set; }

public string LineItemBlobbed { get; set; }
于 2015-03-27T16:13:50.713 回答