簡體   English   中英

播種數據。 SqlException: INSERT 語句與 FOREIGN KEY 約束沖突

[英]Seeding data. SqlException: The INSERT statement conflicted with the FOREIGN KEY constraint

我在 asp.net.core Entityframework 6,CodeFirst 方法中工作。 我相信我以錯誤的順序或錯誤的方式播種數據。 我對藝術家/作者/聲音/關聯名稱使用類似的方法。 我得到了與所有人類似的錯誤。

整個錯誤讀取為藝術家或作者 SqlException:INSERT 語句與 FOREIGN KEY 約束“FK_AssociatedNames_artistModels_ArtistModelArtistId”沖突。 沖突發生在數據庫“BookDB”、表“dbo.artistModels”的“ArtistId”列中。 保存模塊的正確方法是什么? 首先閱讀了這篇文章 EF Code The INSERT statement conflicted with the FOREIGN KEY constraint這就是我認為我正在接近保存錯誤的地方。

編輯:我設法在另一個項目中重新創建了問題並得到了同樣的錯誤。

public class BookModel
{
   [Key]
   public int BookId { get; set; }
   public ICollection<AssociatedNames>? AssociatedNames { get; set; }
   public ICollection<AuthorModel>? Authormodels { get; set; }
}

public class AssociatedNames
{
   [Key]
   public int AssociatedNamesId { get; set; }
   public string? nameString { get; set; }
   public int? BookId{ get; set; }
   public BookModel? bookModel { get; set; }
   public int? AuthorId { get; set; }
   public AuthorModel AuthorModel { get; set; }
}

public class AuthorModel
{
  [Key]
  public int AuthorID { get; set; }
  public string Firstname { get; set; }     
  public ICollection<AssociatedNames>? AssociatedNames { get; set; }  
  public int? BookId { get; set; }
  public BookModel? bookModel{ get; set; }
}

public class SeedData
{
  private readonly UserManager<IdentityUser> userManager;
  private readonly SignInManager<IdentityUser> signInManager;
  private readonly BookDBContext bookDBContext;
  public AuthorModel AuthorModels { get; set; }
  public BookModel BookModels { get; set; }
  public AssociatedNames _AssociatedNames { get; set; }

  public SeedData(UserManager<IdentityUser> userManager, SignInManager<IdentityUser> signInManager, BookDBContext bookDBContext)
   {
    this.userManager = userManager;
    this.signInManager = signInManager;
    this.bookDBContext = bookDBContext;
    }
  public async Task seedData()
    {                      
    var user = new IdentityUser
    {
     UserName = "TestUSer",
     Email = "TestUser@hotmail.com",
    };
     var newAuthor = new AuthorModel { FirstName = "Charles" };
     bookDBContext.AuthorModels.Add(newAuthor);
     var newAss = new AssociatedNames { nameString = "Kallax" };
     bookDBContext.AssociatedNames.Add(newAss);
     var Newbook = new BookModel { BookName = "HelloWorld", AssociatedNames = new List<AssociatedNames> { newAss } };
     bookDBContext.SaveChanges();
     var result = await userManager.CreateAsync(user, "Test!112");
            
     }
  }

在 Program.cs 上

   builder.Services.AddScoped<SeedData>();
static void SeedDatainitialize(IHost host)
{
    var scopefactorty = host.Services.GetService<IServiceScopeFactory>();
    using (var scope = scopefactorty.CreateScope())
    {
    var seed = scope.ServiceProvider.GetService<SeedData>();
      seed.seedData().Wait();
    }
 }
     

上下文。

public class BookDBContext : IdentityDbContext
 {
    public BookDBContext(DbContextOptions<BookDBContext> options) : base(options)
    {

    }
    public DbSet<AuthorModel> AuthorModels { get; set; }
    public DbSet<AssociatedNames> AssociatedNames { get; set; }
    public DbSet<BookModel> BookModels { get; set; }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {

        base.OnModelCreating(modelBuilder);


    }
 }
 

我嘗試使用不同的 void 方法在不同的時間保存它們,因此它們是在不同的階段完全創建的。 然后將 object 添加到 collections。並重復。 不工作

所以我解決了它,我不確定為什么會這樣。 任一 EF 在鍵入正確的 FK 時都存在問題。

public class AssociatedNames
{
    [Key]
    public int AssociatedNamesId { get; set; }
    public string? nameString { get; set; }
    public int? BookModelId{ get; set; }
    public BookModel? BookModels{ get; set; }

    [ForeignKey("AuthorModel")]
    public int? AuthorID { get; set; }
    public AuthorModel AuthorModel { get; set; }

    [ForeignKey("ArtistModel")]
    public int? ArtistId { get; set; }
    public ArtistModel ArtistModel { get; set; }

    [ForeignKey("VoiceActorModel")]
    public int? VoiceActorId { get; set; }
    public VoiceActorModel VoiceActorModel { get; set; }
}

在我的 Model Creation 中,我添加了這些行。

   modelBuilder.Entity<BookModel>().Navigation(e => e.Authormodels).AutoInclude();
        modelBuilder.Entity<BookModel>().Navigation(e => e.ArtistModels).AutoInclude();
        modelBuilder.Entity<BookModel>().Navigation(e => e.VoiceActors).AutoInclude();

我注意到當我編寫代碼時我在調用時沒有包含其他類,然后添加了 AssociatedNames。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM