2012-08-13 26 views
5

各プロパティに対応するデータベースの列の名前を含めるために、POCO T4テンプレートを変更しようとしています。従来の理由から、私たちのデータベーステーブルは8.3であり、カラムは最大10文字であるため、物事が悪化する傾向があります。特定のプロパティに対応する列をすばやく検索できることが大きな助けになります。Entity Frameworkとデータベースの列名

これを踏まえれば、私はこれをどうやってやるべきかわからない。私はT4テンプレートを編集するという考えに慣れていますが、EdmPropertyオブジェクトから列名を取得する方法はわかりません。

誰でも正しい方向に向けることができますか?

+0

私はedmProperty.Nameはあなたが意味するものではないと仮定しています。基になる列名が必要です。 – Maarten

+0

@Maarten - 正しい。 – Bobson

答えて

1

私はすでにいくつかの他の答えでこれについて議論しましたが、わかりません。問題は、この情報を取得するには、マッピングのMSL部分(列がプロパティにマップされる部分)を参照する必要があることです。残念ながら、MSLメタデータアイテムのAPI全体は内部的です(将来のEFリリースの目標の1つは公開することです)。クラス生成のためのT4テンプレートがある場合、通常はCSDLを使用します。これはエンティティの説明であり、エンティティのEDMX図とプロパティウィンドウに表示される情報のみを含みます。

+0

MetadataWorkspaceでは使用できません。私はT4でそれをどうやって得るのか分かりませんでしたが、それ以外のいくつかの答えはそれを示すように見えました。 – Bobson

+0

MetadataWorkspaceでも使用できますが、ワークスペースのクエリはベースアイテムを返します。探したいデータにアクセスするには、それらをキャストする必要があります。 MSLの問題は、これらの型が公開されていないためキャストできないことです。これらのデータを取得するにはリフレクションを使用する必要があります。 –

+0

私はT4が評価されたときに反射が利用可能であると仮定して、反射を使用した答えに満足しています。 – Bobson

0

これはこの問題を解決するための最良の方法だとは言いませんが、これが私のやり方です。私は、BoundField aspコントロールへのバインディングのために、プレーンテキストで列名を取得する必要があり、それはEFテンプレートに焼き付けられませんでした。

私はこの単純なプロパティをロードするだけのコードを追加しました。つまり、カラム名は、私がそれを可能にするためです。 "Column"という名前の "table"オブジェクトに構造体を追加し、列名をconst文字列として公開します。

:このようなコードを作成します

<# 
    EndNamespace(code); 
} 

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

私は、溶液中EDMXファイルの下で個々のファイルを生成しT4テンプレート内のコードのこのビット前にこれを置い

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

+0

私が知る限り、昨日EFを学んだので、間違っている可能性があります。それはedmxファイルに基づいています。デザイナーで名前を変更すると、データベース名ではなくedmx名で表示されます。結果。 –

+1

それは私が考えたものです。これは間違いなく良い解決策ですが、私は別の問題を抱えていました。私の質問は、その名前を変更した後でも、基になるデータベース名を取り出す方法に関するものでした。私はそれが不可能であることをかなり確信していますが、私はあなたがこの質問を見つけた誰かを助けるためにここでこの答えを残すことをお勧めします。 – Bobson

関連する問題