EntityFramework
ADO.NET

idカラムがないデータベースファースト時の複合キー設定

タイトルママ。
テーブルにidカラムが存在しない場合のDBファーストでも
複合キーを好き勝手に設定できるようにする方法。

経緯

Oracle→SQLServer(まだやってる)へのデータ移行での壁その4くらい。
単一キーであれば[Key]アノテーションを付けるだけでいいんだけど、
複合キーになると"InvalidOperationException"でカラム順がないよと怒られる。
その回避策。

対応内容

***.tt(edmx配下Modelに生成される4ファイルのうちの一つ)を以下のように編集

***.tt(line66~)
    var simpleProperties = typeMapper.GetSimpleProperties(entity);
    if (simpleProperties.Any())
    {
        int orderNo = 0; //追加
        foreach (var edmProperty in simpleProperties)
        {
#>
/*追加ここから*/
    <# if (ef.IsKey(edmProperty)){ #> 
    [Key, Column(Order = <#= orderNo.ToString() #>)]
    <# orderNo++; #>
    <# } #>
/*追加ここまで*/
    <#=codeStringGenerator.Property(edmProperty)#>
<#
        }
    }
***.tt(line415~)
    public string UsingDirectives(bool inHeader, bool includeCollections = true)
    {
        return inHeader == string.IsNullOrEmpty(_code.VsNamespaceSuggestion())
            ? string.Format(
                CultureInfo.InvariantCulture,
                "{0}using System;{1}" +
                "{2}",
                inHeader ? Environment.NewLine : "",
                (includeCollections ? (Environment.NewLine + "using System.Collections.Generic;") : "")
                    +Environment.NewLine +"using System.ComponentModel.DataAnnotations;" //追加
                    +Environment.NewLine +"using System.ComponentModel.DataAnnotations.Schema;", //追加
                inHeader ? "" : Environment.NewLine)
            : "";
    }

なにやってんのこれ?

各種出力されるフォーマットにちょっと手を加えている。
上はPKに[Key Column(Order = n)]アノテーションを付属させるため。
下はusingを2種追加。上記2種のアノテーションを使うため。
なので極論としては下は省いて上の変更にクラス参照をきちんと記述してやるのでもよい。
見栄えはともかく。