ASP. NET Core 2.2 EF - база данных не заполняется

Я занимаюсь разработкой веб-приложения MVC с использованием Asp .Net Core 2.2 и EntityFramework. Я новичок в фреймворке, и я пытаюсь заполнить базу данных, но при тестировании база данных все еще пуста. Я просмотрел предыдущие сообщения о вызове моего метода Initialize через Program.cs, который я пытался реализовать, поэтому я не уверен, что я пропустил? Я пытался найти ответ, что может происходить, но другие решения указывают на предыдущие версии фреймворка.

Любая помощь будет принята с благодарностью!

Мой метод инициализации базы данных выглядит следующим образом:

public static void Initialize(ApplicationDbContext context)
    {
        {
            //Look for any IncidentTypes
            if (context.IncidentType.Any())
            {
                return; // DB has been seeded
            }

            var incidentTypes = new IncidentType[]
            {
                 new IncidentType { Id = 1, Type = "Urgent"},
                 new IncidentType { Id = 2,Type = "Non-Urgent"}
            };

            foreach (IncidentType t in incidentTypes)
            {
                context.IncidentType.Add(t);
            }
            context.SaveChanges();

            var outcomes = new Outcome[]
            {
                new Outcome { Id = 1, OutcomeText = "This type of incident does not apply"},
                new Outcome { Id = 2, OutcomeText = "Go to ED"},
                new Outcome { Id = 3, OutcomeText = "Go to ED"},
                new Outcome { Id = 4, OutcomeText = "CLEAR & LEAVE"}
            };

            foreach (Outcome o in outcomes)
            {
                context.Outcome.Add(o);
            }
            context.SaveChanges();

            var stages = new Stage[]
            {
                new Stage { Id = 1, OutcomeId = 1, StageName = "Complete PS"},
                new Stage { Id = 2, OutcomeId = 2, StageName = "Do Any Apply?"},
                new Stage { Id = 3, OutcomeId = 3, StageName = "Do Any Apply?"},
                new Stage { Id = 4, OutcomeId = 4, StageName = "Do Any Apply?"}
            };

            foreach (Stage s in stages)
            {
                context.Stage.Add(s);
            }
            context.SaveChanges();

            var stageConditions = new StageCondition[]
            {
                new StageCondition { Id = 1, IncidentTypeId = 1, StageId = 1,
                    ConditionText = "This process does not apply to the following: INSERT"},
                new StageCondition { Id = 2, IncidentTypeId = 1, StageId = 2,
                    ConditionText = "First set of Questions"},
                new StageCondition { Id = 3, IncidentTypeId = 1, StageId = 3,
                    ConditionText = "Second set of Questions"},
                new StageCondition { Id = 4, IncidentTypeId = 1, StageId = 4,
                    ConditionText = "Is there a suitable ED alternative?"},
                new StageCondition { Id = 5, IncidentTypeId = 2, StageId = 1,
                    ConditionText = "This process does not apply to the following: INSERT"},
                new StageCondition { Id = 6, IncidentTypeId = 2, StageId = 2,
                    ConditionText = "First set of Questions"},
                new StageCondition { Id = 7, IncidentTypeId = 2, StageId = 3,
                    ConditionText = "Second set of Questions"},
                new StageCondition { Id = 8, IncidentTypeId = 2, StageId = 4,
                    ConditionText = "Is there a suitable ED alternative?"}
            };

            foreach (StageCondition c in stageConditions)
            {
                context.StageCondition.Add(c);
            }
            context.SaveChanges();
        }

Мой класс Program.cs выглядит следующим образом:

public class Program
{
    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<ApplicationDbContext>();
                DbInitializer.Initialize(context);
            }
            catch (Exception ex)
            {
                var logger = services.GetRequiredService<ILogger<Program>>();
                logger.LogError(ex, "An error occured creating the DB.");
            }
        }

        host.Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}

и мой контекст базы данных выглядит следующим образом:

public class ApplicationDbContext : IdentityDbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }
    public DbSet<Models.IncidentType> IncidentType { get; set; }
    public DbSet<Models.Incident> Incident { get; set; }
    public DbSet<Models.StageCondition> StageCondition { get; set; }
    public DbSet<Models.Outcome> Outcome { get; set; }
    public DbSet<Models.Stage> Stage { get; set; }
}

РЕДАКТИРОВАТЬ: Добавлена ​​модель IncidentType ниже:

    public class IncidentType
{
    public int Id { get; set; }
    public string Type { get; set; }
}

}


person A. Jones    schedule 25.01.2019    source источник
comment
Привет, Джонс. Не могли бы вы добавить модель IncidentType? Идентификатор [Ключ]? В этом случае вы не можете вставлять значения с данным идентификатором, так как IDENTITY_INSERT включен. Кроме того, если это нормальное целочисленное поле, проверьте, заполнена ли таблица IncidentType из-за первого условия if.   -  person LukaszBalazy    schedule 25.01.2019
comment
Привет. Я добавил модель IncidentType. Я попытался удалить первый оператор If для проверки, но безуспешно.   -  person A. Jones    schedule 25.01.2019
comment
По соглашению свойство с именем Id или ‹имя типа› Id будет настроено как ключ сущности. Переименуйте поле идентификатора или удалите инициализацию идентификатора из сидера. Это должно помочь.   -  person LukaszBalazy    schedule 25.01.2019
comment
Я удалил Id из сеялки, и теперь он работает! Спасибо за помощь   -  person A. Jones    schedule 25.01.2019


Ответы (1)


Ваш проект не работает из-за IDENTITY_INSERT, который по умолчанию включен. Структура Entity по соглашению рассматривает Id / Id как первичные ключи и не может вставлять записи с заданным «Id». Пожалуйста, переименуйте это поле, если вы не хотите рассматривать его как первичный ключ, но я бы посоветовал оставить его как есть и позволить ему работать.

Кроме того, я бы рекомендовал прочитать о внедрении зависимостей и внедрении DatabaseSeeder как синглтона, чтобы создать один экземпляр после запуска приложения. Вставлять какую-либо логику в класс Program - плохая практика.

person LukaszBalazy    schedule 25.01.2019