Как в ASP .NET Core при запуске программы добавлять данные в таблицу базы данных Entity Framework если таблица пуста?

При запуске сайта в классе SampleData я проверяю, пусты ли базы данных Executors и Services. Их я создаю с помощью Entity Framework. Executors и Services - это объекты DbSet, которые состоят из классов Executor и Service соответственно. Вот как они у меня выглядят:

Класс Executor

public class Executor
{
    [Key]
    public int Id { get; set; }
    public string name { get; set; }
    public string surname { get; set; }
    public string email { get; set; }
    public string photoPath { get; set; }
    public string description { get; set; }

    public Executor(int Id, string name, string surname, string email, string photoPath, string description)
    {
        this.Id = Id;
        this.name = name;
        this.surname = surname;
        this.email = email;
        this.photoPath = photoPath;
        this.description = description;
    }
}

Класс Service

public class Service
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public bool Metric { get; set; }
    public int Count { get; set; }
    public int Price { get; set; }
    public string TimeScale { get; set; }
    public int Time { get; set; }

    public Service(int id, string name, string description, bool metric, int count, int price, string TimeScale, int time)
    {
        Id = id;
        Name = name;
        Description = description;
        Metric = metric;
        Count = count;
        Price = price;
        this.TimeScale = TimeScale;
        Time = time;
    }
}

Базы данных Executors и Services я задаю в классе DBContext:

public class DBContext : DbContext
{
    public DbSet<Service> Services { get; set; }
    public DbSet<Executor> Executors { get; set; }

    public DBContext(DbContextOptions<DBContext> options)
        :base(options)
    {
        Database.EnsureCreated();
    }
}

При запуске я хочу, чтобы если в таблицах Services и Executors нет никаких данных - они добавлялись бы при запуске как начальные данные. Процесс добавления этих данных я описываю в классе SampleData:

public static class SampleData
{
    public static void Initialize(DBContext context)
    {
        if (!context.Executors.Any())
        {
            context.Executors.AddRange(
                new Executor(1, "Пётр", "Иванов", "[email protected]", "~/wwwroot/img/executor1.jpg",
                "Иванов Пётр"),
                new Executor(2, "Василий", "Мироненко", "[email protected]", "~/wwwroot/img/executor2.jpg",
                "Иванов Пётр"),
                new Executor(3, "Валерий", "Лиско", "[email protected]", "~/wwwroot/img/executor3.jpg",
                "Иванов Пётр"),
                new Executor(4, "Георгий", "Спицин", "[email protected]", "~/wwwroot/img/executor4.jpg",
                "Иванов Пётр"),
                new Executor(5, "Степан", "Земельной", "[email protected]", "~/wwwroot/img/executor5.jpg",
                "Иванов Пётр")
                );
        }

        if (!context.Services.Any())
        {
            context.Services.AddRange(
                new Service(1, "Посадка декоративного кустарника",
                "Декоративный кустарник, высаженный на подходящем месте и гармонично вписывающийся в общий дизайн ландшафта – может полностью преобразить территорию, придав ей более элегантный, живописный и законченный вид. Кусты привозятся нашими сотрудниками. В работу включена также подготовка почвы и удобрение земли.",
                false, 1, 350, "минуты", 20),
                new Service(2, "Посадка плодово-ягодного кустарника",
                "Ягодный кустарник крыжовник или сортовая малина отлично подойдут для живой изгороди и порадуют своих владельцев вкусными и сочными ягодами. Смородина придаст очарования любому саду в период созревания ягод. Наиболее выигрышно будут смотреться кусты смородины, если рядом высадить плодовые кустарники с разной окраской плодов – белой, черной, розовой и красной. Кусты привозятся нашими сотрудниками. В работу включена также подготовка почвы и удобрение земли.",
                false, 1, 350, "минуты", 20),
                new Service(3, "Посадка декоративных деревьев",
                "Декоративные деревья, отличаясь друг от друга окраской, формой кроны и орнаментом листвы, наравне с декоративными кустарниками великолепно подчеркивают достоинства ландшафта и являются настоящим украшением для любой территории. Деревья подбираются и привозятся нашими сотрудниками. В работу включена также подготовка почвы и удобрение земли.",
                false, 1, 2500, "минуты", 40),
                new Service(4, "Посадка плодово-ягодных деревьев",
                "Плодово-ягодные деревья – настоящий кладезь витаминов для поддержания отличного здоровья и замечательное украшение сада, радующее красотой цветения и чудесным видом спелых плодов душу и сердце. Деревья подбираются и привозятся нашими сотрудниками. В работу включена также подготовка почвы и удобрение земли.",
                false, 1, 2500, "минуты", 40),
                new Service(5, "Создание ландшафта",
                "Создание ландшафта представляет собой творческий процесс по благоустройству и облагораживанию территории земельного участка с использованием различных компонентов природы. Наши специалисты разработают проект ландшафтного дизайна и осуществят его в самые короткие сроки, используя наиболее подходящие материалы для оформления ландшафта каждой конкретной территории.",
                true, 1000, 13000, "дни", 3),
                new Service(6, "Создание альпийских горок",
                "Горки - одна из самых популярных тенденций ландшафтного дизайна по благоустройству территории земельного участка и украшения его рельефа путем создания альпинария (альпийской горки или альпийской лужайки) или рокария (композиции из камней, хвойных кустарников и различных видов почвопокровных растений). При проведении работ мы используем для укрепления склонов современные методики и лучшие материалы, что позволяет нам создавать альпийские горки разной конструкции, в зависимости от возможностей, вкусов и пожеланий каждого конкретного заказчика.",
                false, 1, 2500, "часы", 1),
                new Service(7, "Создание искусственного водопада",
                "Водопады – величественное явление природы, полюбоваться которым сегодня можно не только в «дикой» природе, но и на собственном земельном участке. Безусловно, речь идет об искусственных водопадах! Выбор и возведение этого величественного сооружения требует соответствующих знаний и навыков, поэтому лучше всего обратиться за помощью к нашим специалистам, которые предложат, спроектируют и создадут наиболее подходящий для Вашей территории вид водопада.",
                false, 1, 18000, "дни", 2),
                new Service(8, "Создание газона",
                "Газон, ровный и безукоризненный, представляет собой важнейший декоративный элемент, являясь истинным украшением для любой территории, гармонично завершающим создание ландшафта. Наши специалисты помогут вам создать именно такой газон. За символическую плату вы получите травянистое покрытие премиального класса.",
                true, 1, 500, "часы", 1),
                new Service(9, "Профессиональная обрезка растительности",
                "Правильная и грамотная обрезка плодовых деревьев и кустарников – залог отличного урожая. Правильная и грамотная обрезка декоративных деревьев и кустарников (включая живые изгороди) – залог ухоженной и аккуратной территории земельного участка. Мы рады предложить Вам качественный уход за растениями Вашего земельного участка по приемлемым ценам.",
                true, 1, 300, "часы", 1),
                new Service(10, "Уборка",
                "Как самый запущенный, так и грамотно организованный и спроектированный профессионалами ландшафт (включая сад, газоны, цветник и т.д.) требует регулярной генеральной уборки. Мы с радостью выполним работы по поддержанию Вашего земельного участка в надлежащем состоянии.",
                true, 100, 4000, "часы", 6)
                );
        }
        context.SaveChanges();
    }
}

DDL таблицы Executors

CREATE TABLE [dbo].[Executors] (
[Id]          INT            IDENTITY (1, 1) NOT NULL,
[name]        NVARCHAR (MAX) NULL,
[surname]     NVARCHAR (MAX) NULL,
[email]       NVARCHAR (MAX) NULL,
[photoPath]   NVARCHAR (MAX) NULL,
[description] NVARCHAR (MAX) NULL,
CONSTRAINT [PK_Executors] PRIMARY KEY CLUSTERED ([Id] ASC)
);

DDL таблицы Services:

CREATE TABLE [dbo].[Services] (
[Id]          INT            IDENTITY (1, 1) NOT NULL,
[Name]        NVARCHAR (MAX) NULL,
[Description] NVARCHAR (MAX) NULL,
[Metric]      BIT            NOT NULL,
[Count]       INT            NOT NULL,
[Price]       INT            NOT NULL,
[TimeScale]   NVARCHAR (MAX) NULL,
[Time]        INT            NOT NULL,
CONSTRAINT [PK_Services] PRIMARY KEY CLUSTERED ([Id] ASC)
);

Вот мой класс Program

public class Program
{
    public static void Main(string[] args)
    {
        var host = CreateHostBuilder(args).Build();
        using (var scope = host.Services.CreateScope())
        {
            var services = scope.ServiceProvider;

            try
            {
                var context = services.GetRequiredService<DBContext>();
                SampleData.Initialize(context);
            }
            catch (Exception ex)
            {
                var logger = services.GetRequiredService<ILogger<Program>>();
                logger.LogError(ex, "An error occurred seeding the DB.");
            }
        }
        host.Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

Вот мой класс Startup

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        string connection = Configuration.GetConnectionString("DefaultConnection");
        services.AddDbContext<DBContext>(options => options.UseSqlServer(connection));
        services.AddControllersWithViews();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app)
    {
        app.UseDeveloperExceptionPage();

        app.UseStaticFiles();

        app.UseRouting();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=SignIn}/{id?}");
        });
    }
}

Моя база данных называется userstoredb. Вот мой JSON в файле appsettings.json, в котором прописан путь к моей базе данных:

{
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=userstoredb;Trusted_Connection=True;MultipleActiveResultSets=true"
    },
"Logging": {
    "LogLevel": {
        "Default": "Information",
        "Microsoft": "Warning",
        "Microsoft.Hosting.Lifetime": "Information"
        }
    },
"AllowedHosts": "*"
}

При запуске программы данные в пустую таблицу не добавляются, хотя должны, судя по скрипту.

Как сделать так чтобы при запуске программы начальные данные, описанные в классе SampleData добавлялись в случае если таблица пуста?


Ответы (0 шт):