ASP.NET MVCでsqlite3を使うまで

# はじめに

この記事は**社会人一年目のぺーぺーエンジニアが吐いた愚痴**の成分が多分に含まれています。  
**「いやそんなとこで詰まるやつおりゅ？」** と思っても、それは**貴方がつよつよなだけ**なので、温かい目で見守って頂けると嬉しいです。

## 注意

この記事は、C#初心者の私が、当時どれぐらい迷走していたかを書くことで、これから同じ道を行く初心者の皆さんの苦労を少しでも減らそうと思って作成したものです。  
[やめ太郎さん](https://qiita.com/Yametaro)の記事が（私にとって）すごく読みやすいので、倣ってぼく記法で書いてみることにしました！

## お品書き

* SQL Serverからsqliteに変更する方法
* きれいにmigrationする方法

### 環境

ASP.NET Core 6.0.9  
Entity Framework Core 6.0.9  
sqlite3  
Visual Studio 2022  

## 発端

ぼく「ASP.NET Core MVCを使って、練習がてらwebページを作れっていわれたよ！」  
ぼく「でも、ASP.NETなんて使ったことないね...」  
ぼく「とりあえず、プロジェクトを作成してそれっぽいのを探そうかな！」  
Visual Studioカチカチ...  
![mvc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2853945/6bd39efc-acb3-6fde-871c-330077e4cbec.png)  
ほく「あ、この**ASP.NET Core アプリ(Model-View-Controller)** っていうのがそれだ！」  
ぼく「プロジェクト名は、まあ練習だし適当でいいや！」  
ぼく「業務に使う練習だから、認証機能は付けてって言われてた！種類は個別のアカウントにしようっと！」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2853945/b62e03d0-06b5-682d-84dc-e7072337fddf.png)  
ぼく「これで最初のステップはOK！よし！」

## sqliteの使い方が分からない

ぼく「えーとまずは、この**SQL Server** っていうDBを**Sqlite**に変更するところだ！」  

``` C#
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using WebApplication2.Data;

var builder = WebApplication.CreateBuilder(args);
// configファイルからconnection stringを貰ってくる
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(connectionString));
```

ぼく「この**options**ってやつのメソッドを変えれば出来そうだ！」  
ぼく「ふむふむ、この型は**DbContextOptionsBuilder**って言うんだ！」  
ぼく「Microsoftのリファレンスを検索ぅ！」  
[DbContextOptionsBuilderのmicrosoftリファレンス](https://learn.microsoft.com/ja-jp/dotnet/api/microsoft.entityframeworkcore.dbcontextoptionsbuilder?view=efcore-6.0)

ぼく「この**UseSqlite**を使えばよさそうだな」  
ぼく「そうなったら善は急げ！早速ここを書き換えて...」  
**VSくん「ブー！！」**  
ぼく「うわわ、『usingディレクトリかアセンブラ参照が足りない』って怒られちゃった...」  
ぼく「でも、**名前空間としてはMicrosoft.EntityFrameworkCore**に入っているはずなのに...」
ぼく「トホホ...」

### 拡張メソッド

ぼく「よくよく考えたら、**このメソッドは拡張メソッドで、元が外部パッケージなんだから、それを導入しないと使えない**じゃん！」  
ぼく「なんでこんなことで悩んでいたんだろう？」  
ぼく「早速、外部パッケージを...、どうやって導入するんだ？」  
ぼく「あっ、この**NuGet パッケージマネージャ>ソリューションのNuGetパッケージ管理**を使うんだ！」  
ぼく「コンソールを使わなくていいから、便利だね！」  
ぼく「Sqliteって検索したら、なんかいっぱい出てきたけど、[リファレンス](https://learn.microsoft.com/ja-jp/dotnet/api/microsoft.entityframeworkcore.sqlitedbcontextoptionsbuilderextensions.usesqlite?view=efcore-6.0)に書いてあった**Microsoft.EntityFrameworkCore.Sqlite.Core**をインストールしたよ！」  
![sqlite.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2853945/9e048554-f745-f4cb-b712-56c35b0fbc86.png)
ぼく「これでVSくんも怒らなくなったし、ついにSqliteが使えるね！」
ぼく「早速migrationをやってみよう！」

## migrationが分からない

意気揚々とmigrationを実行しようとするぼくくん。  
しかし、ぼくくんの前にはもう一つの壁がありました。  

### migrationの方法が分からない

ぼく「どうやってmigrationを実行すればいいんだ...」  
ぼく「リファレンスにはpowershellって書いてあるけど、visual studioのpowershellだとプロジェクトが見つからないとかで動かないぞ...」  
ぼく「...」  
ぼく「いやこれ階層が違うだけだ、powershellの初期位置が.slnがあるディレクトリだから、.csprojがある階層に移動しないといけないのか」

### migrationに失敗する理由が分からない

ぼく「よし、あとはチュートリアル通りに、`dotnet ef migrations add InitialCreate`と入力して...」  
ぼく「`Update-Database`！」  
**VSくん「ブブー！！nvarchar(max)はsqliteでは使用できないフィールド型だよ！」**  
ぼく「**？？？？？？？？？？？？？？？？？？？？？？**」  
ぼく「生成されているInitialCreateファイルに**初めからnvarchar(max)が使われて**いる...」  
ぼく「**sqliteはその型に対応していない**」  
ぼく「もしかして、これって、詰んでるってコト！？」  
ぼく「まあ、ちまちま直せば動くでしょ...」  
ﾁﾏﾁﾏ修正中...  
`:%s/nvarchar(max/nvarchar(2048/g`  
ぼく「ふい～やっと全部修正終わった～」  
ぼく「動いてくれ～～頼む～～～」  
**VSくん「ヨシ！」**  
ぼく「やった～動いた～」  

### 原因

ぼく「でも、どうして動かなかったんだろう？」  
神「それはの、**ASP.NET Core アプリ(Model-View-Controller)** を入れたときに遡るんじゃ」  
ぼく「ネ、**ネットの神！**」  
神「このプロジェクト開始時、**migrationした結果のファイルが、初期から生成**されておる」  
神「このファイルは、**SQL Server用にmigration**されておるのじゃ」  
神「その結果、**SQL Server用のファイルをsqliteで見ることになって、にっちもさっちもいかなくなってしまった**というわけじゃな」  
ぼく「な、なるほど...」  
ぼく「**初心者救済システムにはまってしまった**というわけだったのか...」  
ぼく「解説ありがとう、神！」  
神「ふぉっふぉっ、これからも精進するのじゃぞ」ｽｰ

## まとめ

### 総括

初めて記事を書きましたが、かなりカロリーを使いました！  
こんなミスすることはあまりないと思いますが、誰かの役に立てればうれしいです！  

### 教訓

* 公式リファレンスを読もう
* ﾁﾏﾁﾏ何かをしているときは何かがおかしいと気付こう