セージ の メモ書き

メモこそ命の恩人だ

C# - スキャフォールディング

スキャフォールディング(Scaffolding:足場)

  • アプリケーションからDBアクセスするための足場を作ること。
  • EntityFramework の場合、IDE の UI 操作で実行する。
  • EntityFrameworkCore の場合、コマンドでスキャフォールディングを実行する。
    後述参照。

準備

  • コンソールアプリの場合、NuGet から以下をインストールする。
  • ASP.NET MVC の場合、以下にすべて含まれてるのでインストール不要。

ちなみに、コントロールアプリでライブラリが未インストールの状態だと、以下のようなメッセージが表示された。
表示されるものをインストールしていけばOK。

Your startup project 'ConsoleApp1' 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.

dotnet ef dbcontext scaffold コマンド

EF Core ツールのリファレンス (.NET CLI) - EF Core | Microsoft Docs

  • スキャフォールディングを行える。
  • プロジェクトファイル(.csproj)のある場所でコマンドを実行すること。
    • 別のフォルダーで実行した場合、以下のエラーが表示された。
    • No project was found. Change the current working directory or use the --project option.
  • オプション
    • o FilePath:クラスファイルを配置するパス。相対パス
    • f:既存のファイルを上書き
-- フォーマット
dotnet ef dbcontext scaffold "DB接続文字列" Microsoft.EntityFrameworkCore.SqlServer -o "出力先のパス"

-- Microsoft のサンプル(Modelsフォルダー配下に生成する)
dotnet ef dbcontext scaffold "Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -o Models

-- 自作
set SERVER=localhost\インスタンス名
set ID=sa
set PASSWORD=パスワード
set DbName=DB名
set OutPath=出力パス
dotnet ef dbcontext scaffold "Data Source=%SERVER%;Initial Catalog=%DbName%;Persist Security Info=True;User ID=%ID%;Password=%PASSWORD%" Microsoft.EntityFrameworkCore.SqlServer -o %OutPath% -f
-- スキャフォールディングできたことを確認
set SERVER=localhost\***
set ID=sa
set PASSWORD=***
set DBNAME=SampleDB
set OUTPATH=Models\SampleDb
dotnet ef dbcontext scaffold "Data Source=%SERVER%;Initial Catalog=%DBNAME%;Persist Security Info=True;User ID=%ID%;Password=%PASSWORD%" Microsoft.EntityFrameworkCore.SqlServer -o %OUTPATH% -f

実行結果

  • 以下のコードが自動生成された。
  • SampleDBの内容と一致していることを確認
// SampleTable.cs
public partial class SampleTable
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}
// SampleDBContext

public partial class SampleDBContext : DbContext
{
    public SampleDBContext()
    {
    }

    public SampleDBContext(DbContextOptions<SampleDBContext> options)
        : base(options)
    {
    }

    public virtual DbSet<SampleTable> SampleTable { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
#warning To protect potentially sensitive information in your connection string, you should move it out of source code. See http://go.microsoft.com/fwlink/?LinkId=723263 for guidance on storing connection strings.
            optionsBuilder.UseSqlServer("Data Source=localhost\\***;Initial Catalog=SampleDB;Persist Security Info=True;User ID=sa;Password=***");
        }
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.HasAnnotation("ProductVersion", "2.2.6-servicing-10079");

        modelBuilder.Entity<SampleTable>(entity =>
        {
            entity.Property(e => e.Id).ValueGeneratedNever();

            entity.Property(e => e.Name).HasMaxLength(50);
        });
    }
}

DbContextの使用

  • SampleDBContextにより、データを追加できたことを確認。
  • 実行後、SSMSにて確認。
public class HomeController : Controller
{
    public IActionResult Index()
    {
        using (var dbContext = new SampleDBContext())
        {
            var sample = new SampleTable()
            {
                Id = 1,
                Name = "おためし",
                Age = 30,
            };
            dbContext.SampleTable.Add(sample);
            dbContext.SaveChanges();
        }
        return View();
    }
}



以上