ASP.NET CoreでSQLServerに初期データを注入する

公開日:2018-12-10
最終更新:2018-12-10

SeedDataファイルの作成

Models下にSeedData.csを作成。
using()内でContextをインスタンス化し、context.<テーブル名>.AddRange()内でカラムの値を指定している。
なお、context.Sample.Any()でデータが入っていた場合はSeedDataの挿入は実行されない。

// 略  
public class SeedData  
{  
    public static void Initialize(IServiceProvider serviceProvider)  
    {  
        using (var context = new SampleContext  (serviceProvider.GetRequiredService<DbContextOptions<SampleContext>>()))  
        {  
            // Look for any Samples.  
            if (context.Samples.Any())  
            {  
                // DB has been seeded  
                return;  
            }  

            context.Samples.AddRange(  
                new Sample  
                {  
                    sample_id = 1,  
                    sample_data = "hogehoge"  
                }  
            );  
            context.SaveChanges();  
        }  
    }  
}  

Program.csにシードデータ挿入の実行を指定する。

プログラム実行時にシードデータの挿入を行うようにProgram.csに処理を入れる。
リファレンスをまるっとコピーでいい。
内容としてはサービスプロバイダーからContextを取得してマイグレートした後にシードデータをイニシャライズしている?

// 略  
public static void Main(string[] args)  
{  
    var host = CreateWebHostBuilder(args).Build()  
    using (var scope = host.Services.CreateScope())  
    {  
        var services = scope.ServiceProvider  
        try  
        {  
            var context = services.GetRequiredService<SampleContext>();  
            context.Database.Migrate();  
            SeedData.Initialize(services);  
        }  
        catch (Exception ex)  
        {  
            var logger = services.GetRequiredService<ILogger<Program>>();  
            logger.LogError(ex, "An error occurred seeding the DB.");  
        }  

    host.Run();  
}  
// 略  

データがきちんと挿入されたかは、SQL Server オブジェクトエクスプローラー > 該当のテーブルを右クリック > データの表示で確認できる。

Controllerでデータベースのデータを取得する

リファレンスによれば、最新のEntityFrameworkではLINQを使ってデータベースに問い合わせるとある。
Controllerならデフォルトでusing System.Linq;があるので特になにもしなくてもいい。
コンストラクタで、Controllerで使うDBのコンテキスト取得し、プロパティ_contextに読み取り専用で保持する。
以下はIndexアクションでsample_idが1のレコードを取得している。

public class SampleController : Controller  
{  
    private readonly SampleContext _context;  

    public SampleController(SampleContext context)  
    {  
        _context = context;  
    }  

    public IActionResult Index()  
    {  
        var SampleId = _context.Samples.Single(b => b.sample_id == 1);  
        return int[] { SampleId.sample_data };  
    }  
}  

データベース操作クエリについてはリファレンスに詳しく載っている。

記事が少しでもいいなと思ったらクラップを送ってみよう!
0
+1
@showyleeの技術ブログ

よく一緒に読まれている記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる

技術ブログをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

技術ブログを開設する

Qrunchでアウトプットをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

Markdownで書ける

ログ機能でアウトプットを加速

デザインのカスタマイズが可能

技術ブログ開設

ここから先はアカウント(ブログ)開設が必要です

英数字4文字以上
.qrunch.io
英数字6文字以上
ログインする