我正在努力使用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; }
}
此处具有一对多关系的LineItem
[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>();
}
}
其他CRUD方法(Insert,GetALL)正在工作,除了通过ID获取Invoice,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);
}
非常感谢任何帮助。
答案 0 :(得分:2)
在追逐阴影三天之后,事实证明这只是一件非常简单的事情。我想要保存像这样的对象列表
[OneToMany(CascadeOperations = CascadeOperation.All)]
public List<LineItem> LineItems { get; set; }
我错过了重复SQLite.Net是一个轻量级ORM这一事实的文档部分 - 这一点不够强调,所以你必须删除你的全尺寸ORM帽子,如EF。因此,在阅读了
的SQLite-Net Extension文档之后文字blobbed属性 文本 - blobbed属性在加载时被序列化为文本属性,并在加载时反序列化。这允许在单个列中将简单对象存储在同一个表中。 文本blobbed属性具有序列化和反序列化对象的一小部分开销和一些限制,但是存储基本类型的List或Dictionary等简单对象或简单关系的最佳方法。
我改变了我的预言,现在一切都按预期工作了。现在关注处理Async和Await的细微差别
[TextBlob("LineItemBlobbed")]
public List<LineItem> LineItems { get; set; }
public string LineItemBlobbed { get; set; }