Supabase:更新带Reference属性的列失败,求助解决方法
问题原因与解决方案
你遇到的问题是因为ORM无法直接通过设置**导航属性AssignedTo**来自动更新对应的外键列assigned_to。导航属性主要用于查询时的关联加载,而非直接映射外键字段的更新操作。
解决方案一:显式添加外键属性到模型
在Incident类中添加对应外键列的属性,直接更新该属性即可:
[Table("Incidents")] public class Incident : BaseModel { [PrimaryKey("id", false)] public int Id { get; set; } [Column("title")] public string Title { get; set; } [Column("created_at")] public DateTime CreatedAt { get; set; } // 添加外键属性,对应数据库的assigned_to列 [Column("assigned_to")] public int? AssignedToId { get; set; } [Reference(typeof(User), ReferenceAttribute.JoinType.Left, columnName: "assigned_to")] public User? AssignedTo { get; set; } }
修改更新代码,直接设置外键属性:
var incident = await client .From<Incident>() .Where(incident => incident.Id == update.Id) .Set(incident => incident.Title, update.Title) .Set(incident => incident.Description, update.Description) .Set(incident => incident.Priority, update.Priority) .Set(incident => incident.AssignedToId, update.AssignedTo?.Id) .Update();
解决方案二:直接使用SQL片段更新外键列
如果不想修改模型结构,可以通过SetSql方法直接指定外键列的更新逻辑:
var incident = await client .From<Incident>() .Where(incident => incident.Id == update.Id) .Set(incident => incident.Title, update.Title) .Set(incident => incident.Description, update.Description) .Set(incident => incident.Priority, update.Priority) .SetSql("assigned_to = @assignedToId", new { assignedToId = update.AssignedTo?.Id }) .Update();
关键说明
ORM的Set方法针对导航属性时,默认不会自动提取关联对象的主键值来更新外键列——它更倾向于处理关联对象本身的修改,而非外键字段的变更。因此必须直接操作外键列对应的属性或SQL片段,才能正确更新assigned_to字段。
内容的提问来源于stack exchange,提问作者Ricardo Felgueiras
相关产品推荐
相关产品推荐

