EF Core:足場で生成されたモデルの名前のカスタマイズ

古いASP.NET MVCプロジェクトでは、データベーステーブルモデルが同じ名前で保存されていました。 小文字、アンダースコアなど、DTOはすでに.NET命名標準に含まれています







これにはいくつかの理由があります。 主なもの:モデルのスコープは明示的に設定されます linqクエリを構築するときの便利さ。たとえば、sqlクエリからテーブルと列の名前を安全に転送できる場合。







残念ながら、.NET CoreアプリケーションではEDMXはサポートされなくなり、CLI チームにはかなり貧弱な機能セットがあります。 したがって、私たちは少しの工夫をしなければなりませんでした。







おそらくリリース1.2ではこのオプションが追加されますが、現時点では追加されていないため、極端な一時的な対策を講じる必要があります。







ステップ1.プロジェクトの作成



最初に、すべてのモデルを含むプロジェクトを作成します。 .NET Coreコンソールアプリケーションになります。











クラスライブラリではなくコンソールアプリケーションを使用する理由を尋ねます。 問題は、Entity Frameworkがこれらのフレームワークのみの.NET Core CLIコマンドをサポートしていることです。









また、クラスライブラリは、運命ではなくネット標準を使用します。 いずれの場合でも、作成されたコンソール.NET CoreアプリケーションをASP.NET Coreプロジェクトに追加できます。







ステップ2. project.jsonの構成



私はこのファイルが何を担当しているのかを描くために、茂みをbeatり回しません。







{ "version": "1.0.0-*", "buildOptions": { "debugType": "portable", "emitEntryPoint": true }, "dependencies": { "Microsoft.NETCore.App": { "type": "platform", "version": "1.0.0" }, "Microsoft.EntityFrameworkCore.SqlServer": "1.0.0", "Microsoft.EntityFrameworkCore.SqlServer.Design": "1.0.0", "Microsoft.EntityFrameworkCore.Design": "1.0.0-preview2-final" }, "frameworks": { "netcoreapp1.0": { "imports": "dnxcore50" } }, "tools": { "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final" } }
      
      





ステップ3.挿入された依存関係を構成する



作成時、 Program.csは次のようになります。







 namespace DomainModels { public class Program { public static void Main(string[] args) { } } }
      
      





拡大します。 それでは、少し研究に移りましょう。 GitHubでEFソースコードを少し掘り下げた後、scaffolding中にCandidateNamingServiceクラスの依存性注入を発見しました。 コードをざっと見てみると、データベースエンティティの名前を標準の.NET命名規則の形式に変換する役割があることがわかりました。 あとは、GenerateCandidateIdentifier関数をオーバーライドして、エンティティの元の名前を返すだけです。







このオプションにコードを拡張しましょう:







 namespace DomainModels { public class Program { public static void Main(string[] args) { } } public class MyCandidateNamingService : CandidateNamingService { public override string GenerateCandidateIdentifier(string original) { return original; } } }
      
      





もちろん、 GenerateCandidateIdentifierに好みのロジックを入れることができます。







ここで、AddSingletonを使用して依存関係を注入する必要があります。 しかし、それをどこでどのように行うのでしょうか? CandidateNamingServiceは設計時サービスを参照するため、ProgramクラスでConfigureDesignTimeServicesメソッドを定義する必要があります。







 namespace DomainModels { public class Program { public static void Main(string[] args) { } public void ConfigureDesignTimeServices(IServiceCollection services) { services.AddSingleton<CandidateNamingService, MyCandidateNamingService>(); } } public class MyCandidateNamingService : CandidateNamingService { public override string GenerateCandidateIdentifier(string original) { return original; } } }
      
      





できた! モデルを生成する時が来ました。







ステップ4.足場



ここでは詳細に立ち入らず、すべてのCLI機能について説明します。さまざまな設定なしでコマンドの最終バージョンを検討します。







 dotnet restore dotnet run dotnet ef dbcontext scaffold '---' Microsoft.EntityFrameworkCore.SqlServer
      
      





モデルのセットアップと生成に必要なのはそれだけです。 ちなみに、より便利な足場にするために、私は小さなPowerShell スクリプトを作成しました 。突然、誰かに役立つでしょう。








All Articles