しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Entity Framework Core 1.0 を Full .NET のコンソールアプリケーションで使ってみる

Entity Framework 6 と比較するために Entity Framework Core 1.0 をコンソールアプリケーションで動かしたので、ざっくりと手順を残しておきます。

コンソールアプリケーションに限らず、ASP.NET 4.6 でも同じ手順になると思います。

NuGet で見た EF Core 1.0 の依存関係には .NET Framework 4.5.1 と記載されているので、このバージョン以上であれば動作するはずです。実際に .NET 4.6.1 で試しています。

とりあえず使うためには NuGet から Entity Framework Core をインストールする必要がありますが、依存関係が多いので使用するプロバイダのパッケージをインストールします。

今回は SQL Server で試すので、このパッケージをインストールします。コマンドの方が簡単です。

Install-Package Microsoft.EntityFrameworkCore.SqlServer -Pre

インストールが完了すると、必要なパッケージが全てインストールされます。ASP.NET Core ではパッケージの表示がシンプルになりますが、Full .NET の場合はこれまで通りです。

今のところ SQL Server 以外に SQLite と開発用の InMemory プロバイダが利用可能になっています。

接続文字列などの設定は DbContext の OnConfiguring で行います。インストールしたプロバイダに応じて DbContextOptionsBuilder の拡張メソッドが提供されるので、それを使い最低限の設定を行います。

public class AppDbContext : DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(ConfigurationManager.ConnectionStrings["DefaultSqlConnection"].ConnectionString);
    }

    public DbSet<Product> Products { get; set; }
}

これまで通り ConfigurationManager を使って App.config に保存した接続文字列を読み込みます。

後は LINQ を使ってデータを引っ張ってくるだけです。大して EF 6 との違いはありませんでした。

class Program
{
    static void Main(string[] args)
    {
        var context = new AppDbContext();

        var product = context.Products.FirstOrDefault(x => x.Id == 1000);
    }
}

しかし Full .NET のコンソールアプリケーションでは Startup クラスが存在していないので、DI が関係するログ周りの設定には少しコードを追加する必要があります。

SQL ログを取る

クエリのログは SQL Server Profiler を使っても取れますが、Visual Studio のデバッグウィンドウなどに出力して欲しいので、ログの設定を追加します。

と言っても、公式ドキュメントに設定方法が書いてあったので、基本的にはこれでログが取れます。

Overview of logging and interception - EF Core | Microsoft Learn

しかし、このままだとデバッグウィンドウに出力できないので、NuGet でパッケージをインストールします。

Debug 以外にも Console がありますが、インストールすればあとはほぼ同じです。

パッケージをインストールすると、ILoggerFactory に拡張メソッドが追加されるので、AddDebug メソッドの呼び出しを追加しておきます。この辺りは ASP.NET Core と同じですね。

class Program
{
    static void Main(string[] args)
    {
        var context = new AppDbContext();

        var serviceProvider = context.GetInfrastructure();
        var loggerFactory = serviceProvider.GetService<ILoggerFactory>();

        loggerFactory.AddDebug();

        var product = context.Products.FirstOrDefault(x => x.Id == 1000);
    }
}

これをデバッグ実行すると、Visual Studio のデバッグウィンドウに SQL ログが出力されます。

DI は内部的には常に使われているので、とりあえず IServiceProvider を取得してしまえば、あとは ASP.NET Core の Startup クラスと同じように使えそうです。

モデルクラスは EF 6 のものがそのまま使えそうなので、移行は思ったより簡単そうでした。