OrmLite中能否修改引用与外键默认{PropertyReference}Id命名规则?
自定义OrmLite引用与外键的命名规则
当然可以实现!OrmLite提供了灵活的扩展点,让你能完全自定义外键和引用属性的命名逻辑,刚好能满足你想要的Id_<ReferenceName>这种前缀式命名需求。
实现步骤
核心是通过自定义INamingStrategy来覆盖默认的命名规则,具体操作如下:
- 创建自定义命名策略类
继承OrmLite的DefaultNamingStrategy,重写两个关键方法来适配你的命名习惯:
public class PrefixForeignKeyNamingStrategy : DefaultNamingStrategy { // 从外键属性名解析对应的引用属性名(比如Id_PrimaryAddress → PrimaryAddress) public override string GetReferencePropertyName(string foreignKeyFieldName) { // 优先处理Id_前缀的情况 if (foreignKeyFieldName.StartsWith("Id_", StringComparison.OrdinalIgnoreCase)) { return foreignKeyFieldName.Substring(3); } // 兼容默认的后缀Id规则(比如PrimaryAddressId → PrimaryAddress) return base.GetReferencePropertyName(foreignKeyFieldName); } // 生成外键属性名时使用Id_前缀(比如PrimaryAddress → Id_PrimaryAddress) public override string GetForeignKeyFieldName(string modelName) { return $"Id_{modelName}"; } }
- 注册自定义命名策略
在初始化OrmLite连接工厂时,把自定义策略配置进去:
// 以SQL Server为例,其他数据库方言同理 var dbFactory = new OrmLiteConnectionFactory( "YourConnectionString", SqlServerDialect.Provider) { NamingStrategy = new PrefixForeignKeyNamingStrategy() };
验证你的示例代码
现在你的Customer类写法就能正常被OrmLite识别了:
public class CustomerAddress { public int Id { get; set; } public string Street { get; set; } public string City { get; set; } } public class Customer { public int Id { get; set; } public string Name { get; set; } [References(typeof(CustomerAddress))] public int Id_PrimaryAddress { get; set; } [Reference] public CustomerAddress PrimaryAddress { get; set; } }
当你执行关联查询(比如db.SingleById<Customer>(id, include: x => x.PrimaryAddress))时,OrmLite会自动将Id_PrimaryAddress外键与PrimaryAddress引用关联起来,完全符合你的预期。
额外说明
- 这个自定义策略同时兼容默认的
ReferenceNameId命名方式,所以你可以在项目中混合使用两种命名规则; - 如果不需要兼容默认规则,直接去掉
base.GetReferencePropertyName的调用即可; - 不同数据库方言的配置方式基本一致,只需要替换对应的DialectProvider。
内容的提问来源于stack exchange,提问作者Adam Bross
相关产品推荐
相关产品推荐

