دسته بندی ها
19:44 1398/07/14

رفع خطا در مایگریشن - Specify ON DELETE NO ACTION or ON UPDATE NO ACTION

مشخصات سوال کننده :
کاربر : sunboy     امتیاز کاربر : 14     رتبه کاربر : 49
دسته بندی : Asp.net Core Entity Framework

به این سوال امتیاز بدهید    0
تعداد بازدید این سوال : 6712
پاسخ دهنده : hamdola 23:24 1398/07/26

سلام

شما از جدول product یک ریلیشن دارید به user و از جدول order هم یک ریلیشن به user

در این حالت circle ایجاد نمیشه !

بهتره کدهایی که توی کلاس های user و product و order نوشتی رو قرار بدید.

به این پاسخ امتیاز بدهید    0
امتیاز: 121 رتبه: 12
پاسخ دهنده : sunboy 23:24 1398/07/26

عزیز کدهای بنده مشکلی نداره در واقع وقتی کلید خارجی یوزر رو از یکی از جداول پاک می کنم جدولم ایجاد میشه و مشکلی نداره سوالم رو کامل متوجه نشدید بنده پرسیدم آیا راهی هست این circle رو بدون حذف کلیدخارجی از بین برد یا اینکه حتما باید یکی از کلید خارجی ها را حذف کرد؟

به این پاسخ امتیاز بدهید    0
امتیاز: 14 رتبه: 49
پاسخ دهنده : naserzade 23:24 1398/07/26

سلام. این لینکو یه نگاه بندازید. فک کنم product رو باید به order وصل کنید نه user

لینک

به این پاسخ امتیاز بدهید    0
امتیاز: 20 رتبه: 36
پاسخ دهنده : sunboy 23:24 1398/07/26

مشکل رو رفع کردم اینجا هم میگم اگر کسی چنین مشکلی داشت رفع کنه
از اونجایی که من جدول product قبلا مقدار گرفته بود و چون کلیدی هم که تعریف کردم Required بود باید حتما مقدار می گرفت به مشکل می خورد و جداول رو پر نمی کرد
برای همین کافیه پراپرتی را به صورت زیر ایجاد کنید
 public int? ProductId { get; set; }
قرار دادن یک ؟ در کنار int که باعث میشه جداول مفدار null هم بپذیره

به این پاسخ امتیاز بدهید    1
امتیاز: 14 رتبه: 49
پاسخ دهنده : safir 23:24 1398/07/26

سلام دوستان

دو مدل جدید ایجاد کردم و پس از ایجاد migration، دستور update-database را برای بروز رسانی database اجرا کردم.

اما با خطای زیر مواجه شدم:

There is already an object named 'AspNetRoles' in the database.

لطفا راهنمایی بفرمایید.

به این پاسخ امتیاز بدهید    0
امتیاز: 10 رتبه: 70
پاسخ دهنده : sunboy 23:24 1398/07/26

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

به این پاسخ امتیاز بدهید    0
امتیاز: 14 رتبه: 49
پاسخ دهنده : safir 23:24 1398/07/26

ممنون بابت پاسخ

1- این موضوع مربوط به خطای مایگریشن هست دیگه! تاپیک جدید با موضوع تکراری باعث سر در گمی کاربرا میشه.

2- کلاس جدید به نام aspnetroles ایجاد نکردم که نیاز به تغییر نامش باشه 2 مدل به نام های دیگه هست که اصلا کاری به aspnetroles نداره!

به این پاسخ امتیاز بدهید    0
امتیاز: 10 رتبه: 70
پاسخ دهنده : armandelta2002 00:41 1400/02/29

چند نکته رو باید رعایت کنید

1- در رابطه های یک به چند در قسمت چند از نوع ICollection و [notmaped] باید باشه

2- میتونین از علامت سوال قبل نوع رابطه قسمت یک استفاده کنید مثل

public virtual person? personItem {get;set;}

3-

  modelBuilder.Entity<AccessGroup>()
                         .HasMany(e => e.PermissionItems)
                         .WithOne(e => e.AccessGroupItem)
                         .HasForeignKey(e => e.AccessGroupID)
                         .OnDelete(DeleteBehavior.NoAction);

در رابطه یک به چند بالا به جای HasForeignKey(e => e.ID) بهتره یک پروپرتی برای این کار داشته باید. مانند مثال بالا

4- اگر پروژه شما بزرگ هست یک پروژه کوچک بسازین با کل کلاس ها تون و تیکه تیکه   DbSet هاتون رو اضافه کنین و مپینگ بسازین و دیتابس تست اتون رو بروز کنین تا خطا ها رو پیدا و راحت تر رفع کنید.

5- زمانی که تیکه تیکه دارین ریلیشن ها و کلاس هاتون و DbSet ها رو ویرایش میکنین بهتره تمام فایل های پوشه Migration رو پاک کنین و مجدد add-migration بزنین و بعدش update-database تا اینطوری بدونین در هر قدم مشکل از کجاست.

6- ریلیشن ها رو خودتون دستی ست کنین و مقدار  .OnDelete(DeleteBehavior.NoAction); رو براشون در نظر بگیرن

7- بجای

[Key]
[Column("ID")]

میتونین از

[Key, ForeignKey("ID")]

 استفاده کنین

ویرایش شده در پنج شنبه 30 اردیبهشت 1400 ساعت 03:33:02
به این پاسخ امتیاز بدهید    1
امتیاز: 5 رتبه: 110
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود