C#でEFCore 8

C#でEntity Framework Core 8

Entity Framework Core 8を使う

C#でEfCore 8を使ってみます。SQL大好きなので、SQLを自動生成してしまうこの O/Rマッピングは慣れないのですが、Microsoftさんはもうこっちで走る気らしいので、遅ればせながらやってみました。

EFCoreはインストール済み

Entity Frameworkのことを EFと略します。でCoreは最新版であり、簡略版です。Visual Studioインストール済みならばすでにインストール済みだと思います

去年あたりから、必要性に駆られてやろうとしていたのですが、よくわからず。しかもやってるうちにどんどん破壊的バージョンアップを繰り返すので、少し離れていました。

Oracleまでまとめたところで、Microsoft LearnのEntity Framework Coreをそのままやってみようとやった記録です。なのでMicrosoftを読んだ方が正確です。で、MicrosoftのサンプルはSQLiteなのでそこだけSQL serverに変えました

2023年11月以降は、.net8になっていると思います。バージョンのチェックは

dotnetのバージョン確認
C:\Users\f1225>dotnet --list-sdks
8.0.100 [C:\Program Files\dotnet\sdk]

C:\Users\f1225>dotnet --list-runtimes
Microsoft.AspNetCore.App 7.0.14 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 8.0.0 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.NETCore.App 7.0.14 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 8.0.0 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.WindowsDesktop.App 7.0.14 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
Microsoft.WindowsDesktop.App 8.0.0 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

で、確認できます。入っていなければupdateを受けてください。

C#のEFCore8で初めて接続する

ここからは、Microsoft Learnにしたがってやっていきます

まずは、c#のコンソールを選びます

プロジェクト作成

名前は言われた通りにします。初めてのEFCoreアプリ をみて進めましょう

プロジェクト作成

画面はありません。まずはModel.csクラスを追加します。

Model.cs
    using Microsoft.EntityFrameworkCore;

    public class BloggingContext : DbContext
    {
        public DbSet<Blog> Blogs { get; set; }
        public DbSet<Post> Posts { get; set; }
    
        public string DbPath { get; }
    
        public BloggingContext()
        {
    
        }
    
        protected override void OnConfiguring(DbContextOptionsBuilder options)
            => options.UseSqlServer(@"Data Source=localhost\SQLEXPRESS;Initial Catalog=mydb;Integrated Security=SSPI;TrustServerCertificate=true;");
    }
    
    public class Blog
    {
        public int BlogId { get; set; }
        public string Url { get; set; }
    
        public List Posts { get; } = new();
    }
    
    public class Post
    {
        public int PostId { get; set; }
        public string Title { get; set; }
        public string Content { get; set; }
    
        public int BlogId { get; set; }
        public Blog Blog { get; set; }
    }
    

MicrosoftのはSQliteなので変えてあります。SQL Serverの設定は C#でSQLServerを見てください。

このプロジェクトのdotnet環境を設定

ここからこのプロジェクトの内部でのdotnet環境を設定します。いつものNuGetと同じような感じですが、今回はコンソールを使います

NuGet設定

すると、Visual Studioの下部にコンソールが開きます。そこでコマンドを入力します

SqlServerのライブラリーをインストール
    Install-Package Microsoft.EntityFrameworkCore.Sqlserver
Nugetインストール

いつものようにNuGet管理からやっても同じです

ここからが違います。さきほど書いたModelに従って2つのテーブルをコマンドで作ってしまいます。

Migration
    install-package Microsoft.EntityFrameworkCore.Tools
    Add-Migration InitialCreate
    Update-Database

ようやくプログラム

ここまでやると、データベースにテーブルが2つ出来ています。同時にプロジェクトの中にMigrationsというフォルダーができて、新しいクラスができています。

今度はmainのプログラムを書いていきます。program.csを開いて次のコードを入れるか、サイトからコピーしましょう

Program.cs
    using System;
    using System.Linq;
    
    using var db = new BloggingContext();
    
    // Note: This sample requires the database to be created before running.
    Console.WriteLine($"Database path: {db.DbPath}.");
    
    // Create
    Console.WriteLine("Inserting a new blog");
    db.Add(new Blog { Url = "http://blogs.msdn.com/adonet" });
    db.SaveChanges();
    
    // Read
    Console.WriteLine("Querying for a blog");
    var blog = db.Blogs
        .OrderBy(b => b.BlogId)
        .First();
    
    // Update
    Console.WriteLine("Updating the blog and adding a post");
    blog.Url = "https://devblogs.microsoft.com/dotnet";
    blog.Posts.Add(
        new Post { Title = "Hello World", Content = "I wrote an app using EF Core!" });
    db.SaveChanges();
    
    // Delete
    //Console.WriteLine("Delete the blog");
    //db.Remove(blog);
    //db.SaveChanges();
実行結果

最後のDELETEは止めています。そうしないと見れないので

SQLがみれない

これでテーブルをみると、確かに更新されているのが見れます。

ですが、これだと私の好きなSQLがまったくみれません。そこで、少し改造してSQLのLogを残すようにします

Model.csの一部改造
    protected override void OnConfiguring(DbContextOptionsBuilder options)
        => options.UseSqlServer(@"Data Source=localhost\SQLEXPRESS;Initial Catalog=mydb;Integrated Security=SSPI;TrustServerCertificate=true;")
        .LogTo(Console.WriteLine);

これだけでいいです。これで実行すると

実行結果

このように、どの部分でどんなSQLになっているか表示されます。