问题描述
对于定义的表
public class Tbl
{
[PrimaryKey]
public int Id { get; set; }
public string Col2 { get; set; }
public string Gen { get; set; }
}
在_conn.Insert(instanceOfTbl)
我得到 'cannot UPDATE generated column'.
很公平,但除了直接执行忽略 Gen 的等效 sql 语句之外,是否有一种方法可以将 Gen 标记为已生成(或其他方法)以允许插入/更新?我认为 [Ignore] 列属性不合适,因为 Gen 需要可供阅读。删除 Set 访问器确实会阻止该行为,但会导致读取时该属性始终为 null。
如果相关,我正在使用针对 Android 的 VS、Xamarin、Nuget sqlite-net-pcl 1.7.335。
解决方法
我决定暂时采用这种方法。感谢 Jason 为我指明了方向。
将Tbl拆分为基类Tbl和派生类TblEx。将生成的列属性移动到 TblEx。硬接线 TblEx 以映射到 Sqlite 表 Tbl。提供 TblEx 方法以仅从基类 Tbl 中检索属性。
public class Tbl
{
[PrimaryKey]
public int Id { get; set; }
public string Col2 { get; set; }
}
[SQLite.Table("Tbl")]
public class TblEx : Tbl
{
public string Gen { get; set; }
public Tbl GetTbl() {Tbl t = new Tbl(); t.Id = Id; t.Col2 = Col2; return t;}
}
使用主键 id 更新记录
TblEx tEx = _conn.Table<TblEx>().First(t => t.Id == id);
// Generated field is available as class is TblEx
tEx.Col2 = tEx.Gen + "something";
//Update now works as only base class Tbl without reference to generated column is passed
_conn.Update(tEx.GetTbl());
检索基类的另一种方法是使用 JSON 序列化/反序列化,其优点是不必显式分配属性值,但可能会带来性能成本或类型兼容性限制(我不确定后者是否正确)我对 JSON 了解不多)。
using System.Text.Json;
[SQLite.Table("Tbl")]
public class TblEx : Tbl
{
public string Gen { get; set; }
public Tbl GetTbl()
{return JsonSerializer.Deserialize<Tbl>(JsonSerializer.Serialize(this));}
}