Entityframework 6からDTOを作成するためのT4テンプレートを作成するにはどうすればよいですか?

アランウェイン

Entityframeworkでデータベースファーストモデルを使用している大規模なデータベースがあります。これはインターネットサーバー上にあり、WCFを介して通信します。ドメインモデルは、エンティティ、ストアドプロシージャ、および列/プロパティの名前にすべて小文字を使用します。

クライアントアプリケーションでは、命名規則に標準のPascalCaseを使用したいと思います。

T4テンプレートは、正しい命名規則を使用してEntityframeworkからデータ転送オブジェクトを作成できますか?

もしそうなら、誰かがそれを書く方法の出発点を教えてもらえますか?

明確にするために、Entityframeworkが生成したコードを変更するのではなく、Entityframeworkモデルを別のファイルへの入力として使用して、適切なCamelCase命名を使用して単純なPOCOクラスを追加します。このファイルは、WCFサービスとおそらくAutomapper(または同様のもの)によって。

提案をありがとう。

  • データベース:PostgreSQL 9.5
  • データベースへのインターフェース:Npgsql 3.0.5
  • .NET 4.5
  • Entityframework 6.0
アランウェイン

これに答える人の代わりに、そしてうまくいけば私のような他の初心者を助けるために、単純なクラス定義のみを生成するT4変換DTOclasses.ttを作成するために私がしたことは次のとおりです。

注:これは、.edmxの.ttファイルを置き換えるものではなく、.edmxテンプレートが.edmxファイルを生成した後に実行されます。(ドメインモデルの作成に使用されるコードは変更したくありませんでした)。

Visual Studio 2015 Entityframework 6.0 .NET Framework 4.6.1

♦ Notes on Creating DTOclassess.tt

        This T4 transform was created by first copying the working transform used to build the entity model, MedicalOfficeModel.tt.
        Then, parts of it that were not needed for creation of POCO classes to be used for DTO's (data transfer objects) were removed.

    ♦ Changes made to DTOclassses.tt

        •   Adding "DTO" to namespace.
                public void BeginNamespace(CodeGenerationTools code)
                {
                    var codeNamespace = String.Format("{0}.{1}",code.VsNamespaceSuggestion(), "DTO");
                    if (!String.IsNullOrEmpty(codeNamespace))
                    {
                #>
                namespace <#=code.EscapeNamespace(codeNamespace)#>
                {
                <#+
                        PushIndent("    ");
                    }
                }

        •  Put all POCO classes in single file DTOclasses.cs

                <#
                EndNamespace(code);
            }

            fileManager.Process(false);             <--**False stops the splitting of classes into different files. Default is true.

            #>

        •  Change the property naming code:

                    public string Property(EdmProperty edmProperty)
                    {
                        return string.Format(
                            CultureInfo.InvariantCulture,
                            "{0} {1} {2} {{ {3}get; {4}set; }}",
                            Accessibility.ForProperty(edmProperty),
                            _typeMapper.GetTypeName(edmProperty.TypeUsage),
                            GetPascalCase(_code.Escape(edmProperty)),
                            _code.SpaceAfter(Accessibility.ForGetter(edmProperty)),
                            _code.SpaceAfter(Accessibility.ForSetter(edmProperty)));
                    }

        •  Change the class naming code:

                    public string EntityClassOpening(EntityType entity)
                    {
                        return string.Format(
                            CultureInfo.InvariantCulture,
                            "{0} {1}partial class {2}{3}",
                            Accessibility.ForType(entity),
                            _code.SpaceAfter(_code.AbstractOption(entity)),
                            GetPascalCase(_code.Escape(entity)),
                            _code.StringBefore(" : ", _typeMapper.GetTypeName(entity.BaseType)));
                    }

        •  Removed all the navigational stuff. Replaced everything above the helper functions (i.e., above <#+) with:
                            <#@ template debug="false" hostspecific="true" language="C#" #>
                            <#@ assembly name="System.Core" #>
                            <#@ import namespace="System.Linq" #>
                            <#@ import namespace="System.Text" #>
                            <#@ import namespace="System.Collections.Generic" #>
                            <#@ import namespace="System.Text.RegularExpressions" #>
                            <#@ include file="EF6.Utility.CS.ttinclude" #>
                            <#@ output extension=".cs" #>
                            <#

                            const string inputFile = @"MedicalOfficeModel.edmx";
                            var textTransform = DynamicTextTransformation.Create(this);
                            var code = new CodeGenerationTools(this);
                            var ef = new MetadataTools(this);
                            var typeMapper = new TypeMapper(code, ef, textTransform.Errors);
                            var fileManager = EntityFrameworkTemplateFileManager.Create(this);
                            var itemCollection = new EdmMetadataLoader(textTransform.Host, textTransform.Errors).CreateEdmItemCollection(inputFile);
                            var codeStringGenerator = new CodeStringGenerator(code, typeMapper, ef);

                            if (!typeMapper.VerifyCaseInsensitiveTypeUniqueness(typeMapper.GetAllGlobalItems(itemCollection), inputFile))
                            {
                                return string.Empty;
                            }

                            WriteHeader(codeStringGenerator, fileManager);

                            foreach (var entity in typeMapper.GetItemsToGenerate<EntityType>(itemCollection))
                            {
                                fileManager.StartNewFile(entity.Name + ".cs");
                                BeginNamespace(code);
                            #>
                            <#=codeStringGenerator.UsingDirectives(inHeader: false)#>
                            <#=codeStringGenerator.EntityClassOpening(entity)#>
                            {
                            <#
                                var simpleProperties = typeMapper.GetSimpleProperties(entity);
                                if (simpleProperties.Any())
                                {
                                    foreach (var edmProperty in simpleProperties)
                                    {
                            #>
                                <#=codeStringGenerator.Property(edmProperty)#>
                            <#
                                    }
                                }
                            #>
                            }
                            <#
                                EndNamespace(code);
                            }
                            fileManager.Process(false);

                            #>

        ♦  Added my helper function:
                    <#+

                        public static string GetPascalCase(string name)
                        {
                            return Regex.Replace(name, @"^\w|_\w",
                                (match) => match.Value.Replace("_", "").ToUpper());
                        }
                    #>

すべてが完了すると、これは(VS2015で)完全に実行され、必要なことを正確に実行します。:)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ストアドプロシージャの結果からリストを作成するにはどうすればよいですか。EntityFramework

分類Dev

最初にEntityFramework Core 2.0コードでタイプごとのテーブル継承を作成するにはどうすればよいですか?

分類Dev

ASP .Net MVC 5ビューの作成でリストを作成するにはどうすればよいですか?EntityFrameworkの1対多の関係

分類Dev

Xamarin FormsプロジェクトにEntityFrameworkの移行を追加するにはどうすればよいですか?

分類Dev

EntityFrameworkでSQLServerシーケンスの次の値を取得するにはどうすればよいですか?

分類Dev

非公開のコレクションプロパティをEntityFramework Code Firstでマッピングするにはどうすればよいですか?

分類Dev

リポジトリパターンでEntityFramework Coreから複数のサービスを設定するにはどうすればよいですか?

分類Dev

ASP.NET5のMySQLでEntityFramework 6を使用するにはどうすればよいですか?

分類Dev

C#ObservableCollectionでEntityFrameworkエンティティを使用するにはどうすればよいですか

分類Dev

.NETStandardとEntityFrameworkCoreを使用して既存のデータベース用のEntityFramework edmxファイルを作成するにはどうすればよいですか?

分類Dev

Visual StudioOnlineからEntityFrameworkのmigrate.exeを実行するにはどうすればよいですか?

分類Dev

Visual Studio TeamServicesからASP.NETCore EntityFrameworkの移行を実行するにはどうすればよいですか

分類Dev

LinqPadをEntityFramework Coreで使用するにはどうすればよいですか?

分類Dev

RootObjectDTOでEntityFrameworkを使用するにはどうすればよいですか?

分類Dev

EntityFramework Coreを使用して2つのモジュール間の関係を作成するにはどうすればよいですか?

分類Dev

すべてのEntityFramework 6の移行履歴を完全にリセットするにはどうすればよいですか?(ゾンビの移行!)

分類Dev

コードでEntityFrameworkプロバイダーを定義するにはどうすればよいですか?

分類Dev

INSERTでEntityFrameworkの主キー違反を解決するにはどうすればよいですか?

分類Dev

EntityFramework Coreによって生成されたSQLを表示するにはどうすればよいですか?

分類Dev

関連するエンティティをEntityFramework Core 1.0.1 rawクエリに含めるにはどうすればよいですか?

分類Dev

条件付きの複数のwhere条件を使用してEntityFrameworkでクエリを作成するにはどうすればよいですか?

分類Dev

EntityFrameworkを使用してデータを取得するエンティティを動的に指定するにはどうすればよいですか?

分類Dev

C#のEntityFrameworkでwhere句を使用してSQL更新クエリを作成するにはどうすればよいですか?

分類Dev

Code-First EntityFrameworkアプローチを介してLocalDBまたはSQLExpressの代わりにSQLServer 2017でデータベースを作成するにはどうすればよいですか?

分類Dev

EntityFrameworkを使用せずにASPNET MVC5を使用してSQLServerからテーブルを表示するにはどうすればよいですか?

分類Dev

t4コードジェネレーターなしでEntityFrameworkを作成する(vs 2010など)

分類Dev

RC2の.NETコアクラスライブラリからEntityFramework 6を参照するにはどうすればよいですか?

分類Dev

EntityFrameworkを使用してDbGeographyデータをSQLServer Compactに保存するにはどうすればよいですか?

分類Dev

EntityFrameworkで「In」SQLキーワードを使用するにはどうすればよいですか?

Related 関連記事

  1. 1

    ストアドプロシージャの結果からリストを作成するにはどうすればよいですか。EntityFramework

  2. 2

    最初にEntityFramework Core 2.0コードでタイプごとのテーブル継承を作成するにはどうすればよいですか?

  3. 3

    ASP .Net MVC 5ビューの作成でリストを作成するにはどうすればよいですか?EntityFrameworkの1対多の関係

  4. 4

    Xamarin FormsプロジェクトにEntityFrameworkの移行を追加するにはどうすればよいですか?

  5. 5

    EntityFrameworkでSQLServerシーケンスの次の値を取得するにはどうすればよいですか?

  6. 6

    非公開のコレクションプロパティをEntityFramework Code Firstでマッピングするにはどうすればよいですか?

  7. 7

    リポジトリパターンでEntityFramework Coreから複数のサービスを設定するにはどうすればよいですか?

  8. 8

    ASP.NET5のMySQLでEntityFramework 6を使用するにはどうすればよいですか?

  9. 9

    C#ObservableCollectionでEntityFrameworkエンティティを使用するにはどうすればよいですか

  10. 10

    .NETStandardとEntityFrameworkCoreを使用して既存のデータベース用のEntityFramework edmxファイルを作成するにはどうすればよいですか?

  11. 11

    Visual StudioOnlineからEntityFrameworkのmigrate.exeを実行するにはどうすればよいですか?

  12. 12

    Visual Studio TeamServicesからASP.NETCore EntityFrameworkの移行を実行するにはどうすればよいですか

  13. 13

    LinqPadをEntityFramework Coreで使用するにはどうすればよいですか?

  14. 14

    RootObjectDTOでEntityFrameworkを使用するにはどうすればよいですか?

  15. 15

    EntityFramework Coreを使用して2つのモジュール間の関係を作成するにはどうすればよいですか?

  16. 16

    すべてのEntityFramework 6の移行履歴を完全にリセットするにはどうすればよいですか?(ゾンビの移行!)

  17. 17

    コードでEntityFrameworkプロバイダーを定義するにはどうすればよいですか?

  18. 18

    INSERTでEntityFrameworkの主キー違反を解決するにはどうすればよいですか?

  19. 19

    EntityFramework Coreによって生成されたSQLを表示するにはどうすればよいですか?

  20. 20

    関連するエンティティをEntityFramework Core 1.0.1 rawクエリに含めるにはどうすればよいですか?

  21. 21

    条件付きの複数のwhere条件を使用してEntityFrameworkでクエリを作成するにはどうすればよいですか?

  22. 22

    EntityFrameworkを使用してデータを取得するエンティティを動的に指定するにはどうすればよいですか?

  23. 23

    C#のEntityFrameworkでwhere句を使用してSQL更新クエリを作成するにはどうすればよいですか?

  24. 24

    Code-First EntityFrameworkアプローチを介してLocalDBまたはSQLExpressの代わりにSQLServer 2017でデータベースを作成するにはどうすればよいですか?

  25. 25

    EntityFrameworkを使用せずにASPNET MVC5を使用してSQLServerからテーブルを表示するにはどうすればよいですか?

  26. 26

    t4コードジェネレーターなしでEntityFrameworkを作成する(vs 2010など)

  27. 27

    RC2の.NETコアクラスライブラリからEntityFramework 6を参照するにはどうすればよいですか?

  28. 28

    EntityFrameworkを使用してDbGeographyデータをSQLServer Compactに保存するにはどうすればよいですか?

  29. 29

    EntityFrameworkで「In」SQLキーワードを使用するにはどうすればよいですか?

ホットタグ

アーカイブ