关键词映射误差;
本文关键字:误差 映射 关键词 | 更新日期: 2023-09-27 18:07:14
sysdtslog90是我们用来记录SSIS信息的数据库表。它有几个列名也是c#关键字:event和operator。
我使用EF的逆向工程代码首先创建模型和映射对象。Model在名字前面加了一个@,而Mapping没有。结果,抛出错误(指向映射文件):
;将
无法将lambda表达式转换为类型't',因为它不是委托类型
当我在映射文件的名称中添加@时,它将正确编译。(换句话说t。@event 的 t.event 。
我如何更改Mapper以便它创建与模型相同的名称?
映射代码片段:(没有@)
public class sysdtslog90Map : EntityTypeConfiguration<sysdtslog90>
{
public sysdtslog90Map()
{
// Primary Key
this.HasKey(t => t.id);
// Properties
this.Property(t => t.event)
.IsRequired()
.HasMaxLength(128);
this.Property(t => t.operator)
.IsRequired()
.HasMaxLength(128);
模型片段:
public partial class sysdtslog90
{
...
public string @event { get; set; }
...
public string @operator { get; set; }
...
}
尝试使用.HasColumnName()
映射属性,如果你的对象的属性和你的表的列有不同的名称:
this.Property(t => t.@event).HasColumnName("event");
我不确定您所说的"更改映射器"是什么意思。你的意思是有一些方法,使逆向工程代码第一工具放置一个@
符号在这些属性前,当它生成映射代码?我会说不,除非你修改了那个工具的源代码。
但是为什么不自己调整映射类,就像你做的那样让它编译呢?如果您将其更改为在这些lambda中表示@event
和@operator
,则这些属性仍将映射到数据库中的event
和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) #>;
这完全适用于"operator",但对于event,它仍然这样做:
this.Property(t => t.event)
"operator"看起来不错:
this.Property(t => t.@operator)
希望如果有人读到这篇文章,它可能会激发一个答案。我自己还在努力。注意,我还对类的Table区域应用了相同的方法,虽然它是相同的代码,但事件确实在需要的地方获得@符号。很奇怪。
编辑:所以我根本没有保存。tt文件。上面的代码可以工作。我希望它能帮助到别人。请确保在编辑tt文件后保存它,因为逆向工程不会自动保存这些文件。