2012-08-13 148 views
5

我試圖修改一個POCO T4模板,以在與每個屬性對應的數據庫中包含該列的名稱。出於傳統原因,我們的數據庫表格是8.3,而我們的列是最多10個字符,所以事情往往會變得枯燥。能夠快速查找給定屬性對應的列將會很有幫助。實體框架和數據庫列名

鑑於這一點,我不知道如何去做這件事。我很熟悉編輯T4模板的想法,我只是不知道如何從EdmProperty對象中檢索列名。

任何人都可以指向正確的方向嗎?

+0

我假設edmProperty.Name不是你的意思。您需要底層的列名稱。 – Maarten 2012-08-13 06:15:31

+0

@Maarten - 正確。 – Bobson 2012-08-13 11:20:47

回答

1

我已經在其他答案中討論過這個問題,但是我找不到它。問題是,要獲取這些信息,您需要瀏覽映射的MSL部分 - 列映射到屬性的部分。不幸的是,MSL元數據項目的整個API都是內部的(我認爲未來EF發行版的一個目標是公開)。當你有用於類生成的T4模板時,你通常使用CSDL--這是實體描述,它只包含你在EDMX圖和實體屬性窗口中看到的信息。

+0

它在MetadataWorkspace中甚至不可用?其他幾個答案似乎表明它是這樣的,儘管我無法弄清楚如何在T4中實現它。 – Bobson 2012-08-13 12:00:30

+0

它在MetadataWorkspace中可用,但在工作空間上的查詢返回基本項目,您必須投它們才能訪問您正在查找的數據。 MSL的問題是你不能投射它,因爲這些類型不是公開的 - 你必須使用反射來獲取這些數據。 – 2012-08-13 13:00:08

+0

我會很高興與使用反射的答案,假設評估T4時反射是可用的。 – Bobson 2012-08-13 19:59:02

0

我不會說這是解決這個問題的最好方法,但這是我做到的。我需要能夠以純文本的方式檢索列名,以綁定到BoundField asp控件,並且不會將其烘焙到EF模板中。

所以,我添加了這一點代碼,它只是加載「簡單的屬性」,即:列名,讓我這樣做。它將一個結構添加到名爲「ColumnNames」的「表」對象,並將列名作爲常量字符串公開。

<# 
    if (simpleProperties.Any()) 
    { 
#> 
    public struct ColumnName 
    { 
    <# 
     foreach (var simpleProperty in simpleProperties) 
     { 
    #> 
     public const string <#= simpleProperty #> = "<#= simpleProperty #>"; 
    <# 
     } 
    #> 
    } 
<# } 
#> 
} 

我把這個在溶液中生成EDMX文件下的單個文件的T4模板此位的代碼之前:

<# 
    EndNamespace(code); 
} 

這將創建代碼,看起來像這樣:

public partial class JobPosting 
{ 
    public int PositionRowId { get; set; } 
    public System.Guid PositionRelatedGuid { get; set; } 

    public struct ColumnName 
    { 
     public const string PositionRowId = "PositionRowId"; 
     public const string PositionRelatedGuid = "PositionRelatedGuid"; 
    } 
} 

我希望這會有所幫助。

+0

我沒有在我面前的代碼,但不'simpleProperties'給你基於'edmx'文件的名稱?如果該列在數據庫中被稱爲「myColumnID」,但爲了C#一致性,我已將其在設計器中重命名爲「MyColumnId」,這個名稱顯示在這裏? – Bobson 2014-06-17 16:53:10

+0

據我所知,昨天我學習了EF,所以我可能錯了,它是基於edmx文件的,所以如果你在設計器中重命名它,那麼它會顯示在edmx名稱中,而不是數據庫名稱結果。 – 2014-06-17 16:56:20

+1

這就是我的想法。這絕對是一個很好的解決方案,但是我遇到了另一個問題。我的問題是關於如何在重命名後重新獲取底層數據庫名稱。我幾乎相信這是不可能的,但我鼓勵你在這裏留下這個答案來幫助任何發現這個問題的人。 – Bobson 2014-06-17 16:59:01