دسته بندی ها
14:57 1398/11/08

خطای Introducing FOREIGN KEY constraint may cause cycles or multiple cascade paths در مایگریشن

مشخصات سوال کننده :
کاربر : fateme     امتیاز کاربر : 1635     رتبه کاربر : 2
دسته بندی : Asp.net Core Asp.net Mvc

به این سوال امتیاز بدهید    0
تعداد بازدید این سوال : 3539
هوش مصنوعی

پاسخ هوش مصنوعی

خطای "Introducing FOREIGN KEY constraint may cause cycles or multiple cascade paths" به این دلیل است که SQL Server نمی تواند چندین مسیر به روزرسانی یا حذف در جداول مختلف را به طور همزمان مدیریت کند. این به ویژه زمانی رخ می دهد که وابستگی های چندگانه در بین جداول وجود داشته باشد که ممکن است منجر به حلقه های نامحدود یا چندین مسیر تسهیل شده شود.

برای حل این مشکل، می توانید به یکی از روش های زیر عمل کنید:

  1. غیرفعال کردن رفتار Cascade در یکی ازForeign Key ها.
    برای این کار، می توانید از Fluent API در متد OnModelCreating استفاده کنید:
  2. 
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity()
            .HasOne(c => c.Provience)
            .WithMany() // Assuming Provience doesn't have a navigation property back to Candidator
            .HasForeignKey(c => c.ProvienceID)
            .OnDelete(DeleteBehavior.Restrict); // Use Restrict or NoAction instead of Cascade
    }
    
  3. بررسی وجود وابستگی های متقابل میان جداول و در صورت لزوم آن ها را بازنگری و تصحیح کنید.

پس از اعمال تغییرات، مجدد دستورات Add-Migration و Update-Database را اجرا کنید تا اطمینان حاصل شود که خطا حل شده است.

به این پاسخ امتیاز بدهید    0
امتیاز: - رتبه: -
پاسخ دهنده : hamid_b 14:38 1398/11/10

مشکل شما Multiple cascade paths هست. به این معنی که یک اگر یک ردیف از جدول Provience حذف بشه همه ی ردیف های مرتبط با اون در جدول Candidator حذف میشه.

شما می تونید با استفاده از کد زیر این مشکل رو حل کنید :

 

protected override void OnModelCreating(ModelBuilder builder)
    { 
         builder.Entity<Candidator>().HasOne(p => p.provienceID).WithMany(b => b.ProvienceID)
         .OnDelete(DeleteBehavior.Restrict);
    }

 

البته یک راه حل ساده تر هم وجود داره. میتونید کدهاتون رو به شکل زیر هم تغییر بدید

 

    public class Candidator
    {
        [Key]
        public int CandidatorID { get; set; }
        public string FirstName { get; set; }
        public string Family { get; set; }
        public int? ProvienceID { get; set; }
        [ForeignKey("ProvienceID")]
        public virtual Provience Provience { get; set; }

    }

 

در این صورت اگر مقدار ProvienceID در جدول اصلی حذف بشه در جدول Candidator مقدار null رو میپذیره

به این پاسخ امتیاز بدهید    0
امتیاز: 518 رتبه: 4
پاسخ دهنده : sadati 20:59 1399/10/13

من انجام دادم و حل شد !

فقط چند مسئله :

چرا در هیچ آموزشی به این علامت سوال پس از int در property  تاکید نشده ؟ (?int)

 

 

به این پاسخ امتیاز بدهید    0
امتیاز: 17 رتبه: 41
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود