关键字映射错误

时间:2013-04-03 21:44:06

标签: c# entity-framework

sysdtslog90是我们使用的记录SSIS信息的数据库表。它有几个列名也是C#关键字:event和operator。

我使用EF的逆向工程代码优先创建模型和映射对象。模型最终在名称前面有一个@,而映射则没有。结果,抛出错误(指向映射文件):

  

预期

     

无法将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; }
... 
}

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我不确定“改变映射器”是什么意思。你的意思是否有一些方法可以使反向工程师代码优先工具在生成映射代码时在这些属性前面放置一个@符号?我会说不,除非你修改该工具的源代码。

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

答案 2 :(得分:0)

一年后我也一样。这是我的修复,但不幸的是它不起作用......完全。 设置项目以从逆向工程菜单中自定义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) #>;

这完全适用于&#34;运营商&#34;但对于事件,它仍然这样做:

this.Property(t => t.event)

&#34;操作&#34;看起来不错:

this.Property(t => t.@operator)

希望如果有人读到这篇文章,可能会刺激答案。我自己还在努力。注意,我也对类的Table区域应用了相同的内容,虽然它是确切的代码,但事件实际上确实需要@符号。很奇怪。

编辑:所以我根本就没有保存.tt文件。上面的代码有效。我希望它对某人有帮助。确保在编辑tt文件后保存它,因为逆向工程师不会自动保存这些文件。