3

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

我使用 EF 的 Reverse Engineer Code First 创建模型和映射对象。模型的名称前面有一个@,而映射没有。结果,抛出错误(指向映射文件):

; 预期的

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

3 回答 3

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) #>;

这完全适用于“操作员”,但对于事件它仍然这样做:

this.Property(t => t.event)

“操作员”看起来不错:

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

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

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

于 2014-04-28T17:28:50.483 回答
0

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

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

于 2013-04-03T21:51:45.740 回答
0

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

this.Property(t => t.@event).HasColumnName("event");
于 2013-04-03T21:46:55.273 回答