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