OrmLite中如何显式指定实体类对应数据库列的物理顺序?
问题描述
我定义了如下Log实体类:
[Alias("log")] public class Log { [AutoIncrement] [PrimaryKey] [Alias("id")] public int Id { get; set; } [Required] [Alias("user_id")] [Index(Name = "user_id", Unique = false)] [ForeignKey(typeof(User), ForeignKeyName = "log_fk", OnDelete = "CASCADE", OnUpdate = "CASCADE")] public int UserId { get; set; } [Required] [StringLength(255)] [Alias("action")] public string Action { get; set; } [Required] [Alias("body")] [CustomField("TEXT")] public string Body { get; set; } }
执行db.CreateTableIfNotExists<Log>()创建MariaDB表时,数据库列顺序和类中属性顺序不一致,带CustomField特性的列会紧邻Id列。试过[DataMember(Order = x)]和[Priority(x)]都没用,怎么显式指定列的物理顺序?
解决方案
直接用ServiceStack.OrmLite自带的[Order(int)]特性就能指定列的物理顺序,这是框架专门用来控制列排序的,之前试的那两个特性不对路。
给每个属性加上[Order(x)],数值越小,对应的列在数据库表中越靠前,修改后的实体类示例:
[Alias("log")] public class Log { [AutoIncrement] [PrimaryKey] [Alias("id")] [Order(1)] public int Id { get; set; } [Required] [Alias("user_id")] [Index(Name = "user_id", Unique = false)] [ForeignKey(typeof(User), ForeignKeyName = "log_fk", OnDelete = "CASCADE", OnUpdate = "CASCADE")] [Order(2)] public int UserId { get; set; } [Required] [StringLength(255)] [Alias("action")] [Order(3)] public string Action { get; set; } [Required] [Alias("body")] [CustomField("TEXT")] [Order(4)] public string Body { get; set; } }
- 每个属性的
Order值要唯一,避免顺序冲突 - 如果表已经创建完成,
CreateTableIfNotExists不会修改现有列的顺序,要么删除表重新创建,要么手动通过SQL语句调整列位置
内容的提问来源于stack exchange,提问作者Carlos Ramírez
相关产品推荐
相关产品推荐

