この記事では、Entity Framework Core で 既存のPostgresSQL データベースからモデルクラスを自動作成しする方法をご紹介します。その後、LINQ を使用してデータベースの内容を出力するコンソールアプリケーションを作成します。
環境は、Mac (macOS High Sierra 10.13.3) で .NET Core SDK 2.1.4、PostgreSQL 10.3 、Visual Studio Code になります。
まず、PostgreSQL で以下の SQL を実行します。
CREATE DATABASE ConsoleTest; CREATE TABLE Book ( Id SERIAL PRIMARY KEY, Price int, Title text ); INSERT INTO Book (Price, Title) values (1000,'おはようございます'); INSERT INTO Book (Price, Title) values (500,'こんにちは'); INSERT INTO Book (Price, Title) values (800,'こんばんは');
これで、PostgreSQL の準備ができましたので、.NET Core でコンソールアプリケーションのプロジェクトを作成します。
$ dotnet new console -o ConsoleTest
これでプロジェクトが作成されたので、プロジェクトのルートディレクトリ(.csprojのあるディレクトリ)に移動後、PostgreSQL に必要なパッケージを Nuget からインストールします。
$ cd ConsoleTest
$ dotnet add package Microsoft.EntityFrameworkCore.Tools.DotNet
$ dotnet add package Microsoft.EntityFrameworkCore.Design
$ dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL
$ dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL.Design
さらに、Microsoft.EntityFrameworkCore.Tools.DotNet だけは追加で .csproj に追記が必要なので、以下のように最後に追記します。
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp2.0</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.0.1" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" /> <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.0.0" /> <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="2.0.1" /> <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL.Design" Version="1.1.1" /> </ItemGroup> <!--ここを追記--> <ItemGroup> <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" /> </ItemGroup> </Project>
この設定を以下のコマンドでプロジェクトに反映します。
$ dotnet restore
これでプロジェクトの設定も済んだので、下記コマンドで PostgreSQL のデータベースの内容からモデルクラスを自動生成します。ユーザー名、パスワード、データベース名は適宜読み替えてください。
$ dotnet ef dbcontext scaffold "Server=localhost;Database=consoletest;Username=username;Password=password;" Npgsql.EntityFrameworkCore.PostgreSQL -o Models -f
処理が完了したら Model フォルダが作成されているのが分かります。では、Program.cs を以下のように修正します。
using System; using System.Data; using System.Linq; using ConsoleTest.Models; namespace ConsoleTest { class Program { static void Main(string[] args) { using (var db = new consoletestContext()) { foreach (var book in db.Book) { Console.WriteLine(book.Title); } } } } }
では、実行してみましょう。
$ dotnet build $ dotnet run おはようございます こんにちは こんばんは
うまくデータベースの内容を出力することができました。なお、ビルドや実行時に以下の警告が表示されますが、これはプログラム内部に接続文字列を持っているためです。実際のアプリケーションの場合は、接続文字列を外部ファイルに退避させることが推奨されています。
Models/consoletestContext.cs(15,10): warning CS1030: #warning: 'To protect potentially sensitive information in your connection string, you should move it out of source code. See http://go.microsoft.com/fwlink/?LinkId=723263 for guidance on storing connection strings.' [/Users/xxx/Projects/ConsoleTest/ConsoleTest.csproj]
これで、既存の PostgreSQL データベースから .NET Core アプリケーションを作成できることが分かりましたね。
なお、現時点(2018/03/11)では、MySQL ではデータベースからモデルクラスを作成することができません。 method not implemented というエラー(未実装)が表示されてしまいます。プレビュー版も試したので、当分解決しないと思います。
データベースファーストで開発するのであれば、MySQL ではなく PostgreSQL を選択するのがよさそうです。MySQL もコードファースト(ソースからデータベースを作成)はできるのですけどね。