Xamarin Linq insert/update Sqlite table 带有生成列的记录

Xamarin Linq insert/update Sqlite table record with generated column

为 table 定义

public class Tbl 
{

    [PrimaryKey]
    public int Id { get; set; }
    public string Col2 { get; set; }
    public string Gen { get; set; }

}

其中Gen是一个Sqlite存储生成的always列

_conn.Insert(instanceOfTbl)

我得到'cannot UPDATE generated column'.

很公平,但是除了直接执行忽略 Gen 的等效 sql 语句之外,是否有办法将 Gen 标记为已生成(或其他方法)以允许 insert/update?我认为 [Ignore] 列属性不合适,因为 Gen 需要易于阅读。删除 Set 访问器确实会阻止该行为,但会导致 属性 在读取时始终为 null。

我正在使用 VS、Xamarin、Nuget sqlite-net-pcl 1.7.335 目标 Android,如果相关的话。

我决定暂时采用这种方法。感谢 Jason 为我指明方向。

将 Tbl 拆分为基础 class Tbl 和派生的 class TblEx。将生成的列 属性 移动到 TblEx。硬连线 TblEx 以映射到 Sqlite table Tbl。提供 TblEx 方法以仅从基 class 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());

另一种检索基数 class 的方法使用 JSON serialize/deserialize,它的优点是不必显式分配 属性 值,但可能会带来性能成本或类型兼容性限制(我不确定后者是否正确,因为我对 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));}
}