保存EF6模型(关系图)时遇FormatException错误求助
EF6模型保存时System.FormatException错误的解决方法
问题描述
保存Visual Studio中的EF6模型(对应.tt模板文件)时触发以下错误,导致自动生成的模型文件无法更新或创建,只能手动处理表结构变更:
Severity Code Description Project File Line Suppression State Error Running transformation: System.FormatException: Index (zero based) must be greater than or equal to zero and less than the size of the argument list. at System.Text.StringBuilder.AppendFormatHelper(IFormatProvider provider, String format, ParamsArray args) at System.String.FormatHelper(IFormatProvider provider, String format, ParamsArray args) at System.String.Format(IFormatProvider provider, String format, Object[] args) at Microsoft.VisualStudio.TextTemplating2E969E7BB7507C0E92F45D70D6AE734916F1C3683B5A0611CF49C10204F34C69B4F2034763B4DA31B0F0721B51B303513DC99B843477A989AB522BF93554EA49.GeneratedTextTransformation.TypeMapper.VerifyCaseInsensitiveTypeUniqueness(IEnumerable`1 types, String sourceFile) at Microsoft.VisualStudio.TextTemplating2E969E7BB7507C0E92F45D70D6AE734916F1C3683B5A0611CF49C10204F34C69B4F2034763B4DA31B0F0721B51B303513DC99B843477A989AB522BF93554EA49.GeneratedTextTransformation.TransformText() NT-LLB.AzureSqlDb C:\Users\lars.hermansen\source\repos\NT-AZURE\NT-LLB.AzureSqlDb\AzureSqlModel.tt 1
错误原因
该错误源于EF6模板生成器的TypeMapper.VerifyCaseInsensitiveTypeUniqueness方法中存在字符串格式化参数不匹配的问题,通常是数据库中存在大小写不同但名称完全一致的表、视图或列(例如User和user),触发校验逻辑时触发了格式化bug。
解决步骤
- 排查数据库对象:检查数据库中是否存在大小写重复的表、视图或列,重命名这类对象以消除名称冲突。
- 修复模板代码:若无法修改数据库,可手动编辑
.tt模板文件:- 打开
AzureSqlModel.tt文件 - 搜索
VerifyCaseInsensitiveTypeUniqueness方法 - 找到方法内的
string.Format语句,核对格式化字符串的占位符数量与传入参数数量是否匹配,调整至两者一致;若需临时应急,可注释掉该校验方法的调用(不推荐长期使用)。
- 打开
- 清理重建项目:删除已生成的模型
.cs文件,执行项目清理后重新保存.edmx文件触发代码生成。 - 更新EF6版本:将EntityFramework NuGet包更新至最新稳定版,修复可能存在的版本bug。
内容的提问来源于stack exchange,提问作者Lars Grieg Hermansen
相关产品推荐
相关产品推荐

