古いASP.NET MVCプロジェクトでは、データベーステーブルモデルが同じ名前で保存されていました。 小文字、アンダースコアなど、DTOはすでに.NET命名標準に含まれています 。
これにはいくつかの理由があります。 主なもの:モデルのスコープは明示的に設定されます linqクエリを構築するときの便利さ。たとえば、sqlクエリからテーブルと列の名前を安全に転送できる場合。
残念ながら、.NET CoreアプリケーションではEDMXはサポートされなくなり、CLI チームにはかなり貧弱な機能セットがあります。 したがって、私たちは少しの工夫をしなければなりませんでした。
おそらくリリース1.2ではこのオプションが追加されますが、現時点では追加されていないため、極端な一時的な対策を講じる必要があります。
ステップ1.プロジェクトの作成
最初に、すべてのモデルを含むプロジェクトを作成します。 .NET Coreコンソールアプリケーションになります。
クラスライブラリではなくコンソールアプリケーションを使用する理由を尋ねます。 問題は、Entity Frameworkがこれらのフレームワークのみの.NET Core CLIコマンドをサポートしていることです。
- .NET Framework 4.5.1以降。 (「Net451」、「net452」、「net46」など)
- .NET Core App 1.0。 (「Netcoreapp1.0」)
また、クラスライブラリは、運命ではなくネット標準を使用します。 いずれの場合でも、作成されたコンソール.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 スクリプトを作成しました 。突然、誰かに役立つでしょう。