微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Xamarin Linq 插入/更新带有生成列的 Sqlite 表记录

如何解决Xamarin Linq 插入/更新带有生成列的 Sqlite 表记录

对于定义的表

public class Tbl 
{

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

}

其中 Gen 是一个 sqlite 存储生成的始终列

_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));}
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。