Оператор INSERT конфликтует с ограничением FOREIGN KEY. Оператор завершен - PullRequest
0 голосов
/ 05 октября 2019

У меня есть начальные данные миграции, которые я хочу запустить при запуске метода OnModelCreating в моем приложении.

Часть данных относится к этим двум объектам - State и LGA, поэтому у меня есть эти две строки в дополнение к другим в моем

protected override void OnModelCreating(ModelBuilder modelBuilder)

методе в ApplicationDbContext.

 ...
 public DbSet<State> States { get; set; }
 public DbSet<LGA> LGAs { get; set; }
 ...

и у меня есть метод Seed(), который является методом расширения, который я ожидаю запустить для заполнения двух таблиц.

Я вызываю метод Seed() следующим образом:

modelBuilder.Seed();

Метод расширения определяется следующим образом:

public static class ModelBuilderExtensions
{
    public static void Seed(this ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<State>().HasData(
                new State { Id = 1, Name = "Abia" },
                new State { Id = 2, Name = "Adamawa" },
                new State { Id = 3, Name = "Akwa Ibom" },
                new State { Id = 4, Name = "Anambra" },
                new State { Id = 5, Name = "Bauchi" },
                new State { Id = 6, Name = "Bayelsa" },
                new State { Id = 7, Name = "Benue" },
                new State { Id = 8, Name = "Borno" },
                new State { Id = 9, Name = "Cross River" },
                new State { Id = 10, Name = "Delta" },
                new State { Id = 11, Name = "Ebonyi" },
                new State { Id = 12, Name = "Edo" },
                new State { Id = 13, Name = "Ekiti" },
                new State { Id = 14, Name = "Enugu" },
                new State { Id = 15, Name = "Gombe" },
                new State { Id = 16, Name = "Imo" },
                new State { Id = 17, Name = "Jigawa" },
                new State { Id = 18, Name = "Kaduna" },
                new State { Id = 19, Name = "Kano" },
                new State { Id = 20, Name = "Katsina" },
                new State { Id = 21, Name = "Kebbi" },
                new State { Id = 22, Name = "Kogi" },
                new State { Id = 23, Name = "Kwara" },
                new State { Id = 24, Name = "Lagos" },
                new State { Id = 25, Name = "Nasarawa" },
                new State { Id = 26, Name = "Niger" },
                new State { Id = 27, Name = "Ogun" },
                new State { Id = 28, Name = "Ondo" },
                new State { Id = 29, Name = "Osun" },
                new State { Id = 30, Name = "Oyo" },
                new State { Id = 31, Name = "Plateau" },
                new State { Id = 32, Name = "Rivers" },
                new State { Id = 33, Name = "Sokoto" },
                new State { Id = 34, Name = "Taraba" },
                new State { Id = 35, Name = "Yobe" },
                new State { Id = 36, Name = "Zamfara" },
                new State { Id = 37, Name = "Abuja (FCT)" },
                new State { Id = 38, Name = "Non Nigerian" }
                );

        modelBuilder.Entity<LGA>().HasData(
            new LGA { Id = 1, StateId = 1, Name = "Aba North" },
            new LGA { Id = 2, StateId = 1, Name = "Aba South" },
            new LGA { Id = 3, StateId = 1, Name = "Arochukwu" },
            ...
            new LGA { Id = 784, StateId = 16, Name = "Ahiazu - Mbaise" },
            new LGA { Id = 785, StateId = 38, Name = "Foreign" },
            new LGA { Id = 786, StateId = 18, Name = "Kaduna South" },
            new LGA { Id = 787, StateId = 16, Name = "Aboh - Mbaise" },
            new LGA { Id = 788, StateId = 9, Name = "Odukpani" }

Это отношение между двумя объектами

public class LGA
{
    public int Id { get; set; }
    [Display(Name="State")]
    public int StateId { get; set; }
    [Required]
    public string Name { get; set; }

    public ICollection<Town> Towns { get; set; }
    [ForeignKey("StateId")]
    public State State { get; set; }

    public ICollection<ApplicationUser> Residents { get; set; }
}


public class State
{
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }
    [Display(Name="State Code")]
    public string Code { get; set; }

    public ICollection<LGA> LGAs { get; set; }
    public ICollection<ApplicationUser> Residents { get; set; }
}

Но когда я запускаю update-database, я получаю следующую ошибку:

Оператор INSERT конфликтует с ограничением FOREIGN KEY "FK_LGAs_States_StateId". Конфликт произошел в базе данных ... таблица "dbo.States", столбец "Id".

И я убедился, что все состояния включены в код миграции.

Однако я понимаю, что когда я проверяю сгенерированную таблицу States, я не могу найти эту последнюю строку в таблице, хотя она есть в коде заполнения данных

Я использую ASP.NETCore 2.2 с Entity Framework Core на ОС Windows 10

Где я могу ошибаться, пожалуйста?

Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 05 октября 2019

вызвать начальную функцию из файла startup.cs. Создайте класс конфигурации и вставьте его в функцию настройки класса запуска. Это еще один обходной путь для посева данных ..`

public class Startup
{
    public void Configure(Configurations dbMigrationsConfig)
    {
        try
        {
            dbMigrationsConfig.SeedData().Wait();
        }
        catch (Exception ex)
        {
            throw ex.InnerException;
        }

    }
}

public class Configurations
{
    private readonly TemplateContext dbContext;


    public Configurations(TemplateContext _dbContext)
    {
        dbContext = _dbContext;
    }

    public async Task SeedData()
    {
        //You seeding code
    }
}`
0 голосов
/ 05 октября 2019

Изменить имя ограничения FOREIGN KEY. Это будет работать.

...