前回macでsqlserverを動くように設定してみたので、今回はentity frameworkを使ってみます。
現在お仕事でも使っていますが、Joinとかがなんだかなーって感じ・・・
コードを書くためにVisual Stadio For Macを用意しています。
この記事でやっていることとしては、Entity Frameworkの簡単な説明と
マイグレーションファイルを作成してdockerのsqlserverに、テーブル作成(for mac)するところまで、やっています。
環境は下記です
・sqlserver2019(docker)
・Azure Functions(.Net Core 2.1)
・NuGetライブラリ
=> Microsoft.EntityFrameworkCore 2.2.6
=> Microsoft.EntityFrameworkCore.Design 2.2.6
=> Microsoft.EntityFrameworkCore.SqlServer 2.2.6
=> Microsoft.Net.Sdk.Functions 1.0.31
Entity Frameworkについて
ORマッパーです!
プロジェクトにモデルを作ってマイグレーションファイルを生成しておくと、
データベースへのテーブルの作成やカラムが追加された場合のテーブル作り直しなど簡単にできます。
また、データの取得・作成・更新が簡単にできるようになっています。
laravel(php)でいうeloquentみたいな感じです。
NuGetで必要なライブラリインストール
EntityFrameworkでSqlServerに接続して、データをやり取りするにあたって、
下記のライブラリが必要なので、NuGetでインストールしておきます。
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.Design
Microsoft.EntityFrameworkCore.SqlServer
dotnetコマンドを使えるようにする
マイグレーションファイルを作ったりするためにdotnetコマンドを使います。
ここからダウンロードして、インストールします。
インストール後、dotnet –infoで動くか確認しておきます。
$ dotnet --info
.NET Core SDK (global.json を反映):
Version: 3.1.101
Commit: b377529961
dotnet efコマンドをインストールする
dotnet efコマンドも必要なので、下記のコマンドでインストールします。
dotnet tool install --global dotnet-ef
インストール後にdotnet efと打ってみると、
ユニコーン?みたいなAAが表示されて使えることが確認できます。
$ dotnet ef
_/__
---==/ \
___ ___ |. |
| __|| __| | ) \
| _| | _| _/ | //|\
|___||_| / \/\
DBContext(コンテキスト)を用意する
コマンドの設定が終わったら、DBアクセスするためにコンテキストとモデルを用意します。
サンプル
using Microsoft.EntityFrameworkCore;
namespace poc_azure_function
{
using Microsoft.EntityFrameworkCore.Design;
using Model;
public class DBContext : DbContext
{
public DbSet<Board> Boards { get; set; }
public DbSet<Message> Messages { get; set; }
public DbSet<User> Users { get; set; }
public DBContext(DbContextOptions<DBContext> options) : base(options)
{
}
}
public class DBContextFactory : IDesignTimeDbContextFactory<DBContext>
{
DBContext IDesignTimeDbContextFactory<DBContext>.CreateDbContext(string[] args)
{
var optionsBuilder = new DbContextOptionsBuilder<DBContext>();
optionsBuilder.UseSqlServer("server=localhost,1433;database=test01;uid=sa;pwd=yourStrong(!)Password;");
return new DBContext(optionsBuilder.Options);
}
}
}
やってること
DbContextクラスを継承して、上記のようなファイルを作成します。
プロパティとして、DbSetで使うモデルを並べます。
DBContextFactoryクラスを作っていますが、ここのUseSqlServerに渡している接続文字列のデータベースに接続に行きます。
Model(モデル)を用意する
今回は掲示板のAPIを想定してモデルを作っています。
Boardのみ載せています。ほかの2つのモデルも同じように作成します。
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace poc_azure_function.Model
{
[Table("boards")]
public class Board
{
public Board()
{
}
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Column("id")]
public long Id { get; set; }
[Column("title")]
public string Title { get; set; }
[Column("user_name")]
public string UserName { get; set; }
[Column("about_text")]
public string AboutText { get; set; }
[Column("password")]
public string Password { get; set; }
}
}
やってること
掲示板のモデルを作っています。
それぞれのプロパティを定義しています。
C#の属性(Attribute)を使って下記のことを行ってます。
・[Table(“table_name”)]で、このクラスと紐づくデーブル名を定義。
・[Key]をつけると主キーになる。
・[DatabaseGenerated(DatabaseGeneratedOption.Identity)]をつけるとインクリメントしてくれる。
・[Column(“column_name”)]で、このプロパティと紐づくカラムの名前を定義。
マイグレーションファイルを作成する!
モデルとコンテキストの用意ができたら、下記コマンドでマイグレーションファイルを作成します。
Migrationsフォルダがプロジェクトの中にできて、ファイルが3つほど作られます。
dotnet ef migrations add InitialCreate
こんな感じでファイルが出来上がります。
マイグレーションする!
下記コマンドでマイグレーションします。
dotnet ef database update
コマンドを走らせると、マイグレーションで適用したファイルがこれだよーってのが出てますね。
Build started...
Build succeeded.
Applying migration '20200205133451_InitialCreate'.
Done.
DBを確認する
テーブルができているのが確認できます!
お疲れ様でしたぁ🍺
逆にDBからテーブルを削除したい時はdropを使ってください。
dotnet ef database drop
エラー
deps.jsonがない(dependencies manifest (xxx) was not found…)
dotnet efでmigrationファイルを作ろうとしたりした時に下記のようにエラーが発生しました。
$ dotnet ef dbcontext list
Build started...
Build succeeded.
Error:
An assembly specified in the application dependencies manifest (poc-azure-function.deps.json) was not found:
package: 'poc-azure-function', version: '1.0.0'
path: 'poc-azure-function.dll'
解決策
.csprojにdllコピーのための設定を書いておきます。
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
<Copy SourceFiles="$(TargetDir)bin$(TargetFileName)" DestinationFiles="$(TargetDir)$(TargetFileName)" />
</Target>
EntityFrameworkCore.Designがない。
Your startup project 'xxx' doesn't reference Microsoft.EntityFrameworkCore.Design. This package is required for the Entity Framework Core Tools to work. Ensure your startup project is correct, install the package, and try again.
解決策
NuGetでMicrosoft.EntityFrameworkCore.Designをインストールしておきます。
コメント