EFCorePowerTools 中支持数值型 RowVersion 的探索与实践
在 EF Core 8.0 中,微软引入了一个重要特性:允许将 SQL Server 和 Azure SQL 中的 RowVersion 列映射为 ulong 类型而非传统的 byte[] 类型。这一特性为开发者提供了更直观的类型处理方式,特别是在处理并发控制场景时。
技术背景
RowVersion 是 SQL Server 中用于实现乐观并发控制的特殊数据类型。传统上,EF Core 将其映射为 byte[] 类型,这在某些场景下可能不够直观。EF Core 8.0 通过 HasConversion 方法,允许开发者将其转换为数值类型(如 ulong),使代码更加清晰易读。
实现方案分析
在 EFCorePowerTools 项目中,可以通过两种方式实现这一特性:
-
深度集成方案:通过派生 CSharpEntityTypeGeneratorBase 和 CSharpDbContextGenerator 类来实现原生支持。这种方式需要深入修改代码生成逻辑,维护成本较高。
-
T4模板定制方案:通过修改现有的 EntityType.t4 和 DbContext.t4 模板文件来实现。这种方式更加灵活,且不需要修改核心代码。
推荐实现方式
考虑到维护成本和灵活性,推荐使用 T4 模板定制方案。具体实现需要在两个模板文件中添加相应的逻辑:
在 EntityType.t4 中,需要检测 RowVersion 类型的属性,并将其类型从 byte[] 改为 ulong:
var propertyType = code.Reference(property.ClrType);
if (property.FindTypeMapping() is Microsoft.EntityFrameworkCore.Storage.RelationalTypeMapping m
&& m.StoreType == "rowversion")
{
propertyType = "ulong";
needsInitializer = false;
}
在 DbContext.t4 中,需要为 RowVersion 属性添加类型转换:
string conversion = string.Empty;
if (property.FindTypeMapping() is Microsoft.EntityFrameworkCore.Storage.RelationalTypeMapping m
&& m.StoreType == "rowversion")
{
conversion = ".HasConversion<byte[]>()";
}
实际应用价值
这种实现方式为开发者带来了以下优势:
- 更直观的数据类型处理,ulong 比 byte[] 更符合开发者对版本号的认知
- 减少类型转换代码,提高代码可读性
- 保持与 EF Core 8.0 新特性的兼容性
- 无需修改 EFCorePowerTools 的核心代码,通过模板即可实现
总结
虽然 EFCorePowerTools 目前没有原生支持数值型 RowVersion 的计划,但通过简单的 T4 模板修改,开发者可以轻松实现这一功能。这种方式既保持了工具的稳定性,又为特定需求提供了灵活的解决方案,体现了 EF Core 生态系统的可扩展性优势。
kernelopenEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。C097
baihu-dataset异构数据集“白虎”正式开源——首批开放10w+条真实机器人动作数据,构建具身智能标准化训练基座。00
mindquantumMindQuantum is a general software library supporting the development of applications for quantum computation.Python058
PaddleOCR-VLPaddleOCR-VL 是一款顶尖且资源高效的文档解析专用模型。其核心组件为 PaddleOCR-VL-0.9B,这是一款精简却功能强大的视觉语言模型(VLM)。该模型融合了 NaViT 风格的动态分辨率视觉编码器与 ERNIE-4.5-0.3B 语言模型,可实现精准的元素识别。Python00
GLM-4.7GLM-4.7上线并开源。新版本面向Coding场景强化了编码能力、长程任务规划与工具协同,并在多项主流公开基准测试中取得开源模型中的领先表现。 目前,GLM-4.7已通过BigModel.cn提供API,并在z.ai全栈开发模式中上线Skills模块,支持多模态任务的统一规划与协作。Jinja00
AgentCPM-Explore没有万亿参数的算力堆砌,没有百万级数据的暴力灌入,清华大学自然语言处理实验室、中国人民大学、面壁智能与 OpenBMB 开源社区联合研发的 AgentCPM-Explore 智能体模型基于仅 4B 参数的模型,在深度探索类任务上取得同尺寸模型 SOTA、越级赶上甚至超越 8B 级 SOTA 模型、比肩部分 30B 级以上和闭源大模型的效果,真正让大模型的长程任务处理能力有望部署于端侧。Jinja00