EF कोर एरर में सेल्फ-रेफरेंसिंग: इन्सर्ट स्टेटमेंट में फॉरेन की समान टेबल कॉन्ट्रास्ट के साथ विरोध किया गया

Aug 18 2020

मेरे पास Categoryस्व-संदर्भ वाला एक मॉडल है और डेटाबेस बनाने पर ठीक काम किया है, फिर भी जब मैं एक मूल श्रेणी (पेरेंटआईड के बिना एक इकाई) सम्मिलित करने का प्रयास करता हूं तो मुझे विदेशी-कुंजी "पेरेंटआईड" की ओर इशारा करते हुए त्रुटि मिलती है, लेकिन जब मैं सम्मिलित करता हूं तो यह ठीक काम करता है SSMS में स्क्रिप्ट सम्मिलित करने के साथ मैन्युअल रूप से एक शीर्ष और एक उपश्रेणी (एक इकाई जिसमें कोई पेरेंट है) जोड़ते समय ef कोर के साथ ठीक काम करता है)

श्रेणी मॉडल

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);
        });

प्रवास

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);
            });
}

मैंने "ParentId" को वैसे भी अशक्त के रूप में चिह्नित किया है जो मैं अभी तक कर सकता था लेकिन एफई कोर मुझे रोक रहा है हालांकि SQL सर्वर इसके साथ ठीक है!

त्रुटि संदेश आंतरिक अपवाद:

INSERT कथन FOREIGN KEY SAME TABLE बाधा "FK_Categories_Categories_ParentId" के साथ विवादित है। डेटाबेस "Unknown_Db", टेबल "dbo.Categories", कॉलम 'Id' में संघर्ष हुआ।

जवाब

1 happykratos Aug 18 2020 at 00:38

इसे आज़माएँ जहाँ आप इनपुट मानों को संभालते हैं:

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