2013-04-03 202 views
3

sysdtslog90是我們使用該日誌SSIS信息的數據庫表。它有幾個列名也是C#關鍵字:事件和操作符。關鍵字映射錯誤

我使用EF的反向工程師代碼首先創建模型和映射對象。該模型最終在名稱前面顯示@,而映射不顯示。結果,引發錯誤(指向映射文件):

;預計

無法轉換lambda表達式鍵入「T」,因爲它不是一個委託類型

當我在映射文件中的@添加到名字,那麼它會被正確編譯。 (換句話說噸。@事件,而不是t.event

我怎樣才能改變映射器,以便它創建同名的模式?

映射段:(不帶@)

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; } 
... 
} 

回答

0

嘗試使用.HasColumnName(),如果你的對象的屬性,你的表的列有不同的映射特性名稱:

this.Property(t => [email protected]).HasColumnName("event"); 
0

我不確定你的意思是「改變映射器」。你的意思是說有什麼方法可以讓反向工程師代碼優先工具在生成映射代碼時在這些屬性前放置一個@符號?我會說不,除非你修改該工具的源代碼。

但是,爲什麼不只是像調整映射類一樣調整映射類呢?如果您更改它以使它在這些lambda表達式中表示@event@operator,那些屬性仍將映射到數據庫中的eventoperator列。前綴@只允許您使用C#關鍵字作爲標識符,它實際上並不是標識符的一部分。因此,一旦代碼被編譯,實體框架將不會「看到」@符號,因此它不會嘗試在列映射中使用它。

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 => [email protected]) 

希望如果有人讀這可能刺激一個答案。我仍然在自己的工作。請注意,我也將類應用於類的Table區域,並且它是確切的代碼,事實上事實上獲得了@符號,它需要在那裏。很奇怪。

編輯:所以我只是沒有保存.tt文件。上面的代碼有效。我希望它能幫助別人。請確保在編輯tt文件後保存它,因爲反向工程師不會自動保存這些文件。