دسته بندی ها
13:06 1399/11/09

دلیل خطای The insert statement conflicted with the FOREIGN KEY

مشخصات سوال کننده :
کاربر : Tarak4135     امتیاز کاربر : 56     رتبه کاربر : 17
دسته بندی : سی شارپ Entity Framework

به این سوال امتیاز بدهید    1
تعداد بازدید این سوال : 3190
1 نظر
saedbfd : توضیحات خیلی کاملی نوشتید اما بهتر بود خطایی هم که میده بگید چی هست. چون خیلی مواقع با فهمیدن خطا میشه راه حل داد و نیاز به بررسی همه این کدها هم نیست.

امتیاز کاربر : 1654   رتبه کاربر : 1   تاریخ ثبت : 04:17 1399/11/09
پاسخ دهنده : fateme 01:40 1399/11/10

کاش توضیحات بیشتری در مورد انتیتی ها می دادید و اینکه وقتی سوال طرح میشه بهتره که خلاصه ای از کدها نوشته بشه. یعنی اینکه همه کدهای پروژه رو کپی و پیست کنیم کار برای بررسی سخت میشه.

اما در مجموع خطایی که شما قرار دادید گفته در جدول TblAnbarTools خطا رخ داده. در این جدول شما 2 تا فیلد تعریف کردید. بقیه پراپرتی ها برای چی تعریف شدن ؟

 

class tblAnbarTools
{
     [Key]
     public int IdAnbar { get; set; }
     [MaxLength(10)]
     public string NameAnbar { get; set; }

     //این پراپرتی ها برای چه منظوری تعریف شدن ؟
     public virtual ICollection<tblNewTools> TblNewTools { get; set; }
     public virtual ICollection<tblDeliver> TblDeliver { get; set; }
     public virtual ICollection<tblTools> TblTools { get; set; }
     public virtual ICollection<tblMoveTools> TblMoveTools { get; set; }
}

 

اگر شما می خواید روابط بین جداولتون رو برقرار کنید بهتره به صورت واضح تر این کار رو کنید و از تفسیر دیتابیس پرهیز کنید. در کدهای بالا منظور این بوده که مثلا جدول tblAnbarTools رابطه یک به چند با جداول دیگه داره. خب همین رو میشد به صورت راحتتری با تعریف کلید خارجی مشخص کرد.

 

class tblMoveTools
    {
     ...

     public int id {get; set;}

     [ForeignKey("id")]
     public virtual tblAnbarTools tblAnbarTools { get; set; }
}

در قطعه کد بالا خیلی واضح مشخص کردیم که فیلد id یک کلید خارجی در جدول tblMoveTools هست. این حالت خیلی ساده تر هست تا اینکه بیایم بگیم هر رکورد از جدول tblAnbarTools یک رابطه یک به چند با سایر جداول داره.

 

امیدوارم منظورم رو خوب رسونده باشم.

به این پاسخ امتیاز بدهید    1
امتیاز: 1617 رتبه: 2
پاسخ دهنده : Tarak4135 09:25 1399/11/10

سلام.

من خودم هم فکر میکنم از همین ارتباط بین جداول باشه چون در جدول tblUser  عملیات  CRUD بدرستی انجام میشه و در جداول دیگه فقط عمل Read انجام میشه و به عمل Insert گیر میده.

این مطلبی که شما عنوان کردید واسه معرفی رابطه یک به چند جدول tblAnbarTools با جداول ذکر شده هست.

//این پراپرتی ها برای چه منظوری تعریف شدن ؟
     public virtual ICollection<tblNewTools> TblNewTools { get; set; }
     public virtual ICollection<tblDeliver> TblDeliver { get; set; }
     public virtual ICollection<tblTools> TblTools { get; set; }
     public virtual ICollection<tblMoveTools> TblMoveTools { get; set; }

الان شما کد رابطه رو در جدول tblMoveTools گفتید.

این کد رابطه در جدول tblAnbarTools چی میشه.

و آیا دیگه لازم نیست این رو درقسمت OnModelCreating(DbModelBuilder modelBuilder) کلاس Context بیاریم.

ممنون میشم بیشتر توضیح بدید.

ویرایش شده در جمعه 10 بهمن 1399 ساعت 12:09:41
به این پاسخ امتیاز بدهید    2
امتیاز: 56 رتبه: 17
1 نظر
fateme : خیر در DbContext هیچ چیزی نیاز نیست تعریف کنید. فقط کافیه هر جایی که کلید خارجی نیاز داشتید مطابق نمونه ای که براتون قرار دادم تعریف کنید و اصلا نیاز نیست خودتون رو درگیر تعریف روابط یک به چند و چند به چند کنید. این سبک بیشتر توی کتابهاست نه پروژه واقعی

امتیاز کاربر : 1617   رتبه کاربر : 2   تاریخ ثبت : 01:47 1399/11/10
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود