Referensi sendiri dalam Kesalahan inti EF: pernyataan sisipan berkonflik dengan batasan tabel kunci asing yang sama

Aug 18 2020

Saya memiliki Categorymodel dengan referensi sendiri dan bekerja dengan baik dalam membuat database namun ketika saya mencoba memasukkan kategori induk (entitas tanpa parentId) saya mendapatkan kesalahan saat menunjuk ke kunci asing "ParentId", tetapi berfungsi dengan baik saat saya memasukkan topel secara manual dengan menyisipkan skrip di SSMS dan berfungsi dengan baik dengan inti ef saat menambahkan subkategori (entitas yang memiliki ID induk)

Model Kategori

public class Category : ICategory
{
    public Category()
    {
    }

    [Key]
    public int Id { get; set; }

    [Required]
    [MinLength(2)]
    [MaxLength(32)]
    public string Title { get; set; }

    public string Icon { get; set; }

    [DefaultValue(true)]
    public bool IsEnabled { get; set; }

    [Required]
    public DateTime CreateTimeStamp { get; set; }

    public DateTime LastUpdateTimeStamp { get; set; }

    [ForeignKey("User")]
    public int CreatorUserId { get; set; }
    
    public int? ParentId { get; set; }

    public virtual User User { get; set; }
    
    [ForeignKey("ParentId")]
    public virtual Category Parent { get; set; }
    public virtual ICollection<Category> Children { get; set; }
    public virtual ICollection<Service> Services { get; set; }
}

DBContext

public DbSet<Category> Categories { get; set; }

modelBuilder.Entity<Category>(entity =>
        {
            entity.HasIndex(e => e.Title).IsUnique();
            entity.HasOne(e => e.User).WithMany(e => e.CreatedCategories)
                .HasForeignKey(e => e.CreatorUserId).OnDelete(DeleteBehavior.Restrict);
            entity.HasOne(e => e.Parent).WithMany(e => e.Children).HasForeignKey(e => e.ParentId).IsRequired(false);
        });

Migrasi

protected override void Up(MigrationBuilder migrationBuilder)
{
        migrationBuilder.CreateTable(
            name: "Categories",
            columns: table => new
            {
                Id = table.Column<int>(nullable: false)
                    .Annotation("SqlServer:Identity", "1, 1"),
                Title = table.Column<string>(maxLength: 32, nullable: false),
                Photo = table.Column<string>(nullable: true),
                IsEnabled = table.Column<bool>(nullable: false),
                CreateTimeStamp = table.Column<DateTime>(nullable: false),
                LastUpdateTimeStamp = table.Column<DateTime>(nullable: false),
                CreatorUserId = table.Column<int>(nullable: false),
                ParentId = table.Column<int>(nullable: true)
            }
            constraints: table =>
            {
                table.PrimaryKey("PK_Categories", x => x.Id);
                table.ForeignKey(
                    name: "FK_Categories_Users_CreatorUserId",
                    column: x => x.CreatorUserId,
                    principalTable: "Users",
                    principalColumn: "Id",
                    onDelete: ReferentialAction.Restrict);
                table.ForeignKey(
                    name: "FK_Categories_Categories_ParentId",
                    column: x => x.ParentId,
                    principalTable: "Categories",
                    principalColumn: "Id",
                    onDelete: ReferentialAction.Restrict);
            });
}

Saya menandai "ParentId" nullable, saya masih bisa ef core mencegah saya meskipun SQL Server baik-baik saja dengan itu!

Pengecualian pesan kesalahan:

Pernyataan INSERT bertentangan dengan kendala FOREIGN KEY SAME TABLE "FK_Categories_Categories_ParentId". Konflik terjadi dalam database "Unknown_Db", tabel "dbo.Categories", kolom 'Id'.

Jawaban

1 happykratos Aug 18 2020 at 00:38

Coba ini di mana Anda menangani nilai masukan:

if (category.ParentId == 0)
{
    category.ParentId = null;
}