C# 关键词映射错误

C# 关键词映射错误,c#,entity-framework,C#,Entity Framework,sysdtslog90是我们用来记录SSIS信息的数据库表。它有几个列名也是C#关键字:事件和运算符 我首先使用EF的反向工程代码来创建模型和映射对象。该模型在名称前面以@结尾,而映射没有。结果,抛出错误(指向映射文件): );期望 无法将lambda表达式转换为类型“t”,因为它不是委托类型 当我将@添加到映射文件中的名称时,它将正确编译。(换句话说,t.@event而不是t.event) 如何更改映射器,使其创建与模型相同的名称 映射代码段:(不带@) 如果对象的属性和表的列具有不同的名称,

sysdtslog90是我们用来记录SSIS信息的数据库表。它有几个列名也是C#关键字:事件和运算符

我首先使用EF的反向工程代码来创建模型和映射对象。该模型在名称前面以@结尾,而映射没有。结果,抛出错误(指向映射文件):

);期望

无法将lambda表达式转换为类型“t”,因为它不是委托类型

当我将@添加到映射文件中的名称时,它将正确编译。(换句话说,t.@event而不是t.event

如何更改映射器,使其创建与模型相同的名称

映射代码段:(不带@)


如果对象的属性和表的列具有不同的名称,请尝试使用
.HasColumnName()
映射属性:

this.Property(t => t.@event).HasColumnName("event");

我不知道你说的“更改映射器”是什么意思。你的意思是说有没有办法让反向工程代码优先工具在生成映射代码时在这些属性前面放置一个@符号?我会说不,除非您修改该工具的源代码


但是为什么不像编译映射类那样自己调整映射类呢?如果将其更改为在这些lambda中显示
@event
@operator
,则这些属性仍将映射到数据库中的
事件
operator
列。
@
前缀只是允许您使用C#关键字作为标识符,实际上它不是标识符的一部分。因此,一旦编译了代码,实体框架就不会“看到”符号
@
,因此它不会尝试在列映射中使用它。

一年后,我有了相同的代码。这是我的修复,但不幸的是它不工作。。。充分地 将项目设置为从反向工程菜单自定义T4模板。然后打开Mapping.tt文件。在这里,您将看到它是如何构建类的

this.Property(t => t.<#= new string[] {"event", "operator"}.Contains(prop.Name.ToString())     ? "@@" + prop.Name.ToString() : prop.Name #>)
<#= string.Join("\r\n                ", configLines) #>;
“操作员”看起来不错:

this.Property(t => t.@operator)
希望如果有人读到这篇文章,可能会得到一个答案。我自己还在努力。注意,我也对类的表区域应用了相同的代码,虽然它是精确的代码,但事实上,事件确实在需要的地方获得了@符号。很奇怪

编辑:所以我没有保存.tt文件。上述代码有效。我希望它能帮助别人。确保在编辑tt文件后保存它,因为反向工程不会自动保存这些文件

this.Property(t => t.<#= new string[] {"event", "operator"}.Contains(prop.Name.ToString())     ? "@@" + prop.Name.ToString() : prop.Name #>)
<#= string.Join("\r\n                ", configLines) #>;
this.Property(t => t.event)
this.Property(t => t.@operator)