.Net Core 3.0 Windows Form + Entity Framework Core + SQLiteを試したい

# 環境
- Windows10 Pro (1903) 64bit
- Visual Studio 2019
- .NET Core 3.0

# 要約すると
.NET Core 3.0でWindows Formがサポートされました。
ASP.NET CoreでEF + SQLiteができるので、WinForm + EF + SQLiteもいけるんじゃね？という発想です。
結論として、CoreじゃないEFと大体同じ手順で出来ましたのでまとめています。
**画像が多めで割と長くなりました。**

# アプローチ
## .NET Core Windows Form Appプロジェクトを立てる
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470282/6c151f9e-fe04-f599-2443-5dac435febef.png)
Windows Forms App (.NET Core)というなかなかの絵面

## ModelとかDbContextとかを別DLLにまとめる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470282/0adb8509-b969-d1f1-9338-861d1b59bf76.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470282/fda12dc7-29a7-5aa5-ac13-cab8f695f474.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470282/9e207a62-b0e2-c3dc-fb88-555e60ab64ff.png)
こんな感じのプロジェクト構成です。
WinFormCoreAppTestからEFCoreTestを参照設定しています。

## Entity Framework Coreのインストール
Nugetからインストールします。
Microsoft.EntityFramework.Core.SQLite
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470282/cadc543b-114a-518b-f198-5faeb9fd940d.png)
Microsoft.EntityFramework.Core.Tools
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470282/c4d35a1b-dbc4-d468-ddab-d84a3739a846.png)

## DLL側プロジェクトにクラスを色々追加する
モデル

```c#:Product.cs
namespace EFCoreTest
{
    public class Product
    {
        [Key]
        public string ProductId { get; set; }

        public int UnitPrice { get; set; }

        public string Name { get; set; }

        public Product()
        {
            ProductId = Guid.NewGuid().ToString();
            UnitPrice = 0;
            Name = string.Empty;
        }
    }
}
```

コンテキスト

```c#:SampleDbContext.cs
namespace EFCoreTest
{
    public class SampleDbContext : DbContext
    {
        /// <summary>
        /// サンプル用DbSet
        /// </summary>
        public DbSet<Product> Products { get; set; }


        public SampleDbContext() : base()
        {
        }

        public SampleDbContext(DbContextOptions options) : base(options)
        {
        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlite("Data Source=sample.db");      //ここでDBファイルを指定
        }
    }
}
```
ここまでやったら一度ビルドしておきます。

## Migrationクラスを作成してDBファイルを作ります
コマンドを実行します。

```powershell
add-migrations (Migration名)
```

こんな感じのログが出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470282/f523d85f-59c4-f1a5-88c2-84082017f36d.png)

出来ました。

```c#:InitialCreate.cs
namespace EFCoreTest.Migrations
{
    public partial class InitialCreate : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.CreateTable(
                name: "Products",
                columns: table => new
                {
                    ProductId = table.Column<string>(nullable: false),
                    UnitPrice = table.Column<int>(nullable: false),
                    Name = table.Column<string>(nullable: true)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_Products", x => x.ProductId);
                });
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropTable(
                name: "Products");
        }
    }
}
```
後はMigrationを実際に反映させるので以下のコマンドを実行します。

```powershell
update-database
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470282/8125f77c-067d-e822-1d34-838327d50a4e.png)

あれ？WinFormCoreAppTestのほうに出来た？
まぁ出来てればなんでもいいので次に進みます。

## Windows FormのUIを ~~適当に~~ 作る
簡単にコントロールを配置して画面を作ります。
.NET Core Windows FormでのUI作成は今回の記事の趣旨ではないのでさらっと流します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470282/cfa03909-725c-86a4-92ce-153ba3b5b8c0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470282/67fea5ec-992c-01a4-7d2e-eb479623c8ff.png)
デフォルトのアイコンが若干お洒落になってる…！

## CRUDを試す
とりあえずサンプルデータを作っておきます。
これが表示されるのでSelectはOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470282/252f035c-209c-18ba-1ac0-5e7f38e19442.png)

とりあえずInsert
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470282/15d03417-39ef-faa0-ca8a-ae8a5c77c78e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470282/e98bbc5b-3719-08c9-4948-f9e231d64be4.png)
一番下が追加されました。

次はUpdate
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470282/3cd6baf5-fff0-250b-c739-f20730b09e97.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470282/554e8dc9-9b97-1405-e3ba-c36a969c7dae.png)
Sample2ってやつが更新されました。

最後Delete。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470282/9e8e70d4-84f3-e97a-9721-265b667ed95b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470282/1c3a4c7b-0caa-fa32-418b-c5e25f0c2fc7.png)
Sample3ってやつを削除しました。

CRUD全部OK。素晴らしい。

# まとめ
- .NET Framework Windows Form + Entity Framework (SQLServer)とほぼ同じ手順でSQLite操作ができました。
- SQLiteのデータベースファイルがどこに出来るか、とか、ビルド時にコピーとか忘れがちかなと思います。
- Windows Form アプリになるのでデータベースファイルがユーザーの環境に置かれるということで、後からテーブル定義変える場合は別途頭使いそう。

以上です。