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になっていると思います。バージョンのチェックは
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クラスを追加します。
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 ListPosts { 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と同じような感じですが、今回はコンソールを使います
すると、Visual Studioの下部にコンソールが開きます。そこでコマンドを入力します
Install-Package Microsoft.EntityFrameworkCore.Sqlserver
いつものようにNuGet管理からやっても同じです
ここからが違います。さきほど書いたModelに従って2つのテーブルをコマンドで作ってしまいます。
install-package Microsoft.EntityFrameworkCore.Tools Add-Migration InitialCreate Update-Database
ようやくプログラム
ここまでやると、データベースにテーブルが2つ出来ています。同時にプロジェクトの中にMigrationsというフォルダーができて、新しいクラスができています。
今度はmainのプログラムを書いていきます。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を残すようにします
protected override void OnConfiguring(DbContextOptionsBuilder options) => options.UseSqlServer(@"Data Source=localhost\SQLEXPRESS;Initial Catalog=mydb;Integrated Security=SSPI;TrustServerCertificate=true;") .LogTo(Console.WriteLine);
これだけでいいです。これで実行すると
このように、どの部分でどんなSQLになっているか表示されます。