Entity Framework Core はまだプレリリースの段階ですが、de:code 2016 で紹介していたので試しに使ってみました。手始めにここ を参考にコンソールアプリケーションを作成してみました。
まずは Visual Studio でコンソールアプリケーション(.NET Core)を作成してみます。
Entity Framework Core 用のパッケージをプロジェクトに追加す。NuGetパッケージマネージャーコンソールを起動して、次のコマンドを入力します。プレリリースなので -pre オプションを指定しています。
Install-Package Microsoft.EntityFrameworkCore.SqlServer –Pre
もちろん、NuGet パッケージマネージャーの画面で'プレリリースを含める'にチェックしてからMicrosoft.EntityFrameworkCore.SqlServerを検索してパッケージを追加することも可能です。
データベースからCode First用のクラスを生成したい場合は追加で次のパッケージもインストールする必要があるようです。詳細は冒頭で紹介したリンク先をご確認ください。
Install-Package Microsoft.EntityFrameworkCore.Tools –Pre
Install-Package Microsoft.EntityFrameworkCore.SqlServer.Design –Pre
記事作成段階でインストールするSQL Server 用の Entity Framework Core は不具合があるようで、出力ウィンドウに次のようなエラーメッセージが表示されます。
Errors in C:\Project\EFCoreSample\src\EFCoreSample\EFCoreSample.xproj Package Ix-Async 1.2.5 is not compatible with netcoreapp1.0 (.NETCoreApp,Version=v1.0). Package Ix-Async 1.2.5 supports:
githubにIssueが登録されていました。ここに記載されている回避方法で、今回は対応することにします。project.json ファイルを開いて、frameworksの設定を変更します。
"frameworks": { "netcoreapp1.0": { "imports": "dnxcore50" } }
を次のように変更します。
"frameworks": { "netcoreapp1.0": { "imports": "portable-net451+win8" } }
ビルドとしとりあえずエラーが発生しないことを確認しました。
次にサンプルとして使用するデータベースとテーブルを作成します。サーバーエクスプローラーで localdb\mssqllocaldb の master dbに接続して次のコマンドを実行します。
USE [master] GO CREATE DATABASE [SampleDb] GO Use [SampleDb] CREATE TABLE [dbo].[Book] ( [Id] INT IDENTITY (1, 1) NOT NULL, [Title] NVARCHAR (100) NOT NULL, [Publish Date] DATETIME2 (7) NOT NULL, PRIMARY KEY CLUSTERED ([Id] ASC) );
データベースの準備も完了です。あとはプログラムを作成していきます。SampleContext.cs クラスファイルを作成して次のようにCode First用のコンテキストクラスを定義してみました。単純に SampleContextクラスとBookというテーブルに対応するBookクラスを定義しただけです。Fluent API と Annotationの両方を試しに使ってみました。まぁここらへんはEntity Framework Code First と変わりがなさそうです。
using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; using System.Threading.Tasks; namespace EFCoreSample { public class SampleContext : DbContext { public virtual DbSet<Book> Books { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=SampleDb;Trusted_Connection=True"); } protected override void OnModelCreating(ModelBuilder modelBuilder) { // Fluent API で構成 modelBuilder.Entity<Book>().Property(e => e.Release).IsRequired(true) .ForSqlServerHasColumnType("datetime2").ForSqlServerHasColumnName("Publish Date"); } } [Table("Book")] public class Book { [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } [Required, MaxLength(200)] public string Title { get; set; } public DateTime Release { get; set; } } }
あとは、既定で作成されるProgram.csファイルにサンプルコードを記載して実行してみました。
namespace EFCoreSample { public class Program { public static void Main(string[] args) { try { using(var ctxt = new SampleContext()) { ctxt.Add(new Book { Title = "sample1", Release = DateTime.Now }); ctxt.Add(new Book { Title = "sample2", Release = DateTime.Now }); ctxt.SaveChanges(); } }catch(Exception ex) { Console.WriteLine(ex.Message); } } } }
Bookテーブルの中身を確認してみます。Bookテーブルを右クリック>テーブル データの表示 をクリックします。
レコードが追加されていることが分かります。
もともとEntity Frameworkは Code First を気に入っていたので Entity Framework Coreで1.0の段階からサポートされているのはありがたいですね。
さんのコメント: さんのコメント: