Entity Framework 7 RC 1およびASP.NET MVC 6の初期データのシード

asp.net-core-mvc c# entity-framework entity-framework-core seeding

質問

Entity Framework 7では、まだシードデータのネイティブサポートはありません( https://github.com/aspnet/EntityFramework/issues/629 )。

DbMigrationsConfigurationクラスはなく、Microsoftが提供するテンプレートコードにSeedメソッドはありません。

では、Entity Framework 7 RC 1を使用するASP.NET MVC 6 Webアプリケーションでデータをシードする方法は?

受け入れられた回答

私は自分のために一時的な回避策を見つけました。

IApplicationBuilderを拡張するメソッドSeedDataを作成し、 GetServiceメソッドを通じてデータベースコンテキストクラスのインスタンスを取得し、それをデータのシードに使用します。

私の拡張メソッドは次のようになります:

using Microsoft.AspNet.Builder;
using Microsoft.Extensions.DependencyInjection;

public static class DataSeeder
{
    // TODO: Move this code when seed data is implemented in EF 7

    /// <summary>
    /// This is a workaround for missing seed data functionality in EF 7.0-rc1
    /// More info: https://github.com/aspnet/EntityFramework/issues/629
    /// </summary>
    /// <param name="app">
    /// An instance that provides the mechanisms to get instance of the database context.
    /// </param>
    public static void SeedData(this IApplicationBuilder app)
    {
        var db = app.ApplicationServices.GetService<ApplicationDbContext>();

        // TODO: Add seed logic here

        db.SaveChanges();
    }
}

それを使用するには、 app.SeedData();アプリケーションのStartupクラス(WebプロジェクトのStartup.csというファイル)のConfigureメソッドの行

// This method gets called by the runtime.
// Use this method to configure the HTTP request pipeline.
public void Configure(
    IApplicationBuilder app,
    IHostingEnvironment env,
    ILoggerFactory loggerFactory)
{
    app.SeedData();

    // Other configuration code
}

人気のある回答

EF Core RTM 1.0およびASP.NET Core RTM 1.0の場合

最初にシードメソッドを作成します。ここでは、現在のリクエストの範囲外なので、それを手動で作成する必要があります。

using System.Collections.Generic;
using System.Linq;
using Core1RtmEmptyTest.Entities;
using Microsoft.Extensions.DependencyInjection;

namespace Core1RtmEmptyTest.Migrations
{
    public static class ApplicationDbContextSeedData
    {
        public static void SeedData(this IServiceScopeFactory scopeFactory)
        {
            using (var serviceScope = scopeFactory.CreateScope())
            {
                var context = serviceScope.ServiceProvider.GetService<ApplicationDbContext>();
                if (!context.Persons.Any())
                {
                    var persons = new List<Person>
                    {
                        new Person
                        {
                            FirstName = "Admin",
                            LastName = "User"
                        }
                    };
                    context.AddRange(persons);
                    context.SaveChanges();
                }
            }

        }
    }
}

次に、ApplicationDbContextの正しい存続時間を指定します

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(ServiceLifetime.Scoped);

最後に、 SeedData()メソッドをConfigureメソッドから呼び出します

public void Configure(IServiceScopeFactory scopeFactory)
{
    scopeFactory.SeedData();


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ