خطای cycles or multiple cascade paths
بسم الله الرحمن الرحیم
خطای زیرا شاید خیلی از شما دوستان عزیز نیز مشاده کردید:
Introducing FOREIGN KEY constraint 'FK_dbo.aspnet_UsersInRoles_dbo.aspnet_Users_UserId' on table 'aspnet_UsersInRoles' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. Could not create constraint. See previous errors
برای حل این مشکل می توانید از Fluid API استفاده کنید،
در این مثل اگر من کد زیر را به Context خود اضافه کنم مشکل بالا برطرف خواهد شد:
protected override void OnModelCreating( DbModelBuilder modelBuilder )
{
modelBuilder.Entity<aspnet_UsersInRoles>().HasMany(i => i.Users).WithRequired().WillCascadeOnDelete(false);
}
همچنین با استفاده از این کد می توانید تمامی CASCADE DELETES ها را از بین ببرید:
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
اینم مشکل زمانی رخ می دهد که شما در طراحی دیتابیس خود یک چرخه یا Loop ایجاد کرده اید مانند تصویر زیر:
بسم الله الرحمن الرحیم
خطای زیرا شاید خیلی از شما دوستان عزیز نیز مشاده کردید:
Introducing FOREIGN KEY constraint 'FK_dbo.aspnet_UsersInRoles_dbo.aspnet_Users_UserId' on table 'aspnet_UsersInRoles' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. Could not create constraint. See previous errors
برای حل این مشکل می توانید از Fluid API استفاده کنید،
در این مثل اگر من کد زیر را به Context خود اضافه کنم مشکل بالا برطرف خواهد شد:
protected override void OnModelCreating( DbModelBuilder modelBuilder )
{
modelBuilder.Entity<aspnet_UsersInRoles>().HasMany(i => i.Users).WithRequired().WillCascadeOnDelete(false);
}
همچنین با استفاده از این کد می توانید تمامی CASCADE DELETES ها را از بین ببرید:
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
اینم مشکل زمانی رخ می دهد که شما در طراحی دیتابیس خود یک چرخه یا Loop ایجاد کرده اید مانند تصویر زیر:
اگر به متن خطای بالا دقت کنید مشاهده خواهید کرد که عبارت may cause cycles or multiple cascade paths قید شده است، همان طور که خدمتتان عرض کردم، اگر در طراحی دیتابیس شما چندین جدول را به صورت بالا طراحی کنید که با یکدگیر در ارتباط باشند و این ارتباط به صورت یک چرخه شود، و سعی کنید بر روی این چرخه CASCADE ایجاد کنید، SQL Server نمی تواند متوجه بشود که چطور فرایند بروز رسانی Update CASCADE یا حذف Delete CASCADE شما را مدیریت کند زیرا هر یک از این جداول بر روی یکدیگر تاثیر می گذارند و در صورتی که فرایند CASCADE آغاز شود نقطه پایانی وجود نخواهد داشت.
Delete CASCADE و Update CASCADE
برای حل این مشکل می توانید به صورت زیر عمل کنید:
1- فرایند CASCADE را غیر فعال کنید (در صورت غیر فعال کردن باید این فرایند را به صورت Manually مدیریت کنید)
2- Relation را حذف کنید (در صورت حذف کردن باید این فرایند را به صورت Manually مدیریت کنید)
طراحی دیتابیس
در چنینی شرایطی معمولا طراح دیتبیس اشتباهی را مرتکب شده است، پس بهتر است از او بخواهید تا دیتابیس خود را مجددا بررسی کنید، زیرا مدیریت کردن راه حل های بالا که قید شد کمی دقت لازم دارد
انشالله در اولین فرصت روش های ایجاد Relation را در MVC معرفی خواهم کرد
محمدجواد
خیلی خوب بود تشکر برای اینکه این مشکل را حل کنم کد ها را باید کجا وارد کنم؟ من دارم یک نرم افزار طراحی می کنم و فعلا دارم DB درست میکنم. لطفا اگر امکان دارد جواب را با شرح و بسط برای بنده ایمیل کنید.
مدیروب سایت
سلام دوست عزیز. شما این کدها را در کلاس contex خود وارد کنید.
موفق باشید