ロック済み edmxデザイナをカスタマイズしたい

  • 2011年10月10日 14:16
     
     

    大まかなカスタムツールの作り方は別質問で分かりました。

    現在edmxデザイナのカスタムツールを既定のEntityModelCodeGeneratorではなく独自のCodeGeneratorに置き換えることで目的のソースを生成することに成功した状態です。

    しかし仕様として足りないものがあります。それはEntityTypeのプロパティに

    • アクセス
    • 抽象
    • エンティティセット
    • ドキュメント
    • 基本型
    • 名前

    がありますがこれを

    • ドキュメント
    • 基本型
    • 名前

    にしたいのです。他にもPropertyの型もドロップダウンから選択するのではなく任意の.NETの型を自由に入れれるようにカスタマイズしたいのです。
    要するにedmxデザイナで扱えるオブジェクトのプロパティを変更したいということです。
    できれば本来の動作に影響を与えないように.edmxという拡張子ではなくここでは.edmx2という拡張子にedmxデザイナを割り当て、そこでの動作ををカスタマイズしたいです。
    その設定は

    C:\Program Files (x86)\Microsoft Visual Studio 10.0\Xml\Schemas\System.Data.Resources.CSDLSchema_1.xsd

    同一フォルダの別のファイルにも関連してそうなのがあります。

    これらやレジストリがデザイナの動作にどのように影響しているか、ドキュメントなどあればurlを教えていただきたいです。

すべての返信

  • 2011年10月10日 14:26
     
     
    ADO.NET Entity Framework 4.1のCode Firstはご存知ですか? .edmxなしでの開発方法が提供されるようになります。
  • 2011年10月10日 14:45
     
     

    早速のお答え有難う御座います。

    ご教授頂いた情報ははじめて聞きましたので検索して見ました。

    http://www.atmarkit.co.jp/fdotnet/ef4basic/ef4codefirst01/ef4codefirst01_01.html

    まだこの1ページしか読んでいませんが既に自分がやりたいことに一番近いと感じています。

    情報が多いのでじっくり読んでみて結果を報告させていただきたいと思います。

  • 2011年12月23日 2:18
     
     回答済み コードあり

    解決法として

    ユーザー(利用プログラマ)にinterfaceを定義します。
    それを継承したクラスを動的に生成してそのインスタンスも動的に生成することでCodeFirst的な動作を実現させました。

    実際にコードは深く入り組んでおり、単純なコードを書く余裕がなかったのでコードの一例だけ書きます。

     

            var ProviderAssemblyName=new AssemblyName("TempAssemblyName");
            var ProviderAssemblyBuilder=AppDomain.CurrentDomain.DefineDynamicAssembly(ProviderAssemblyName,AssemblyBuilderAccess.RunAndCollect);
            var ProviderModuleBuilder=ProviderAssemblyBuilder.DefineDynamicModule("TempModule");
            //var ProviderArray=スキーマAssembly.GetTypes().Where(p => typeof(DatabaseQueryProvider).IsAssignableFrom(p)).ToArray();
            var DatabaseType=typeof(Database);
            var InterfaceType=typeof(ユーザーが定義したインターフェイス);
            var DatabaseTypeBuilder=ProviderModuleBuilder.DefineType("DatabaseType",TypeAttributes.Public|TypeAttributes.Class|TypeAttributes.Sealed,DatabaseType,new[] { InterfaceType });
    
    
    これでDatabaseTypeBuilderに対しインタフェースプロパティのメソッドを動的に定義すれば宣言的に完結に書ける仕組みが実現できました。

     

     

    • 回答としてマーク 和和和 2011年12月23日 2:18
    •