插入语句与外键约束冲突 语句已终止



我有一个迁移种子数据,我希望在应用程序中运行该方法OnModelCreating时运行该数据。

部分数据是针对这两个实体的 -StateLGA,因此除了我的其他行之外,我还有这两行

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 语句与外键约束"FK_LGAs_States_StateId"冲突。数据库中发生冲突...表"dbo。国家","同上"一栏。

我已经确保所有州都包含在移民法中。

但是,我意识到,当我检查生成的States表时,我似乎找不到表中的最后一行,即使它存在于数据种子代码中

我在Windows 10 O.S上运行 ASP.NET Core 2.2和Entity Framework Core。

请问我哪里会出错?

感谢您的协助。

更改外键约束名称。它会起作用。

从 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
}
}`

最新更新