关键词映射误差;

本文关键字:误差 映射 关键词 | 更新日期: 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,则这些属性仍将映射到数据库中的eventoperator列。@前缀只是允许您使用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文件后保存它,因为逆向工程不会自动保存这些文件。