EF: שגיאה במאפיין שהוא foreign-Key
-
יש לי מחלקה עם מאפיין מסויים, שהערכים שלו יכולים להיות רק ערכים שקיימים בטבלה אחרת, והמאפיין הזה הוא שדה חובה מסוג Int.
למשל במחלקה של ההודעות יש מאפיין של סוג ההודעה (מייל, סמס וכדו'). המאפיין מכיל מזהה של הערך, כאשר הערך נמצא בטבלה אחרת שמחזיקה את כל האוספים הללו. ואני מגדיר את זה כFK כדי שלא יוכלו להזין מספר שלא קיים בטבלה הנ"ל.אך משום מה כשאני מריץ את הפרוייקט אני מקבל את השגיאה הנ"ל:
Because all of the properties in the Dependent Role are non-nullable, multiplicity of the Principal Role must be '1'
אני מבין מגוגל שזה בגלל שמדובר במפתח משני שהוא nullable ובאנטיטי א"א לעשות דבר כזה..
אבל - נראה שאינני מבין נכון, כיון שבמקומות אחרים עשיתי את זה וזה עבד טוב
וגם, אם זה לא אפשרי - אז כיצד אני אמור לעשות את זה?פורסם במקור בפורום CODE613 ב04/09/2017 15:20 (+03:00)
-
לפני שנתעמק בשגיאה תרחיב איך הגדרת אותו כFK.
"לפי הספר", בגישת הconventions, בEF עושים FK ע"י ששמים בישות א' (להלן הודעה) מאפיין מסוג ישות ב (להלן סוג הודעה). זהו.
אבל בגלל שהרבה פעמים רוצים גם לקבל ביד את הID המתאים בפרט בארכיטקטורת ווב, אז ניתן להוסיף מאפיין עם השם xxxxId כשxxxx זה שם הישות הזרה (סוג הודעה).
במקרה כזה ניתן אם רוצים גם להשמיט את המאפיין סוג הודעה, ולהסתמך רק על מאפיין הID (נדמה לי אבל שאז מחוייבים להצהיר עם אטריביוט ForgeinKey).
שים לב שחייבים שהישות של סוג הודעה תהיה מוכרזת כDbSet בDbContext! אחרת מבוצעת "השטחה" לכלל מאפייני סוג הודעה והם נכללים בישות הודעה.פורסם במקור בפורום CODE613 ב04/09/2017 15:33 (+03:00)
-
מדובר ב code first from database קיים, ככה שהFK מוגדר ברמה של הדטה בייס, וההגדרה שלו בקוד נוצרה אוטו'.
הבעיה הייתה בבאג של הVS 2017 שנתקלתי בו כבר פעמים רבות, והוא ממש ממש מעצבן... שה build לא תמיד יוצר DLL חדש במקום הקיים, ככה שלמרות שעשיתי בילד לפרוייקט של הEF, הוא לא עדכן את הרפרנס בפרוייקט שתלוי בו, והפרוייקט הנ"ל זרק את השגיאה הזאת. הפתרון היה למחוק את הרפרנס, ולייבא אותו מחדש.
לעצם השאלה שלי: זה כנראה לא היה פירוש השגיאה, כיון שעכשיו זה עובד מצויין למרות שמדובר בשדה מסוג Int שאינו nullable/
לגבי הבאג הזה: אציין שזה קורה לי הרבה פעמים כאשר אני עושה פבליש לכל מיני פרוייקטים, כך שאם כבר עשיתי לו פבליש בעבר, וקיימים לו כבר DLL בשם הזה, הוא לא יוצר אותם מחדש (אני רואה את זה לפי המאפיין תאריך שינוי בוינדוס). הפתרון היה או לעשות את זה בVS 2015 או לעשות rebulid שלפעמים עוזר.. או למחוק את כל הקבצים הקיימים ואז לעשות פבליש חדש..
דוד - תתחדש על הלוגו החדש..
פורסם במקור בפורום CODE613 ב05/09/2017 15:03 (+03:00)
-
מאוד מתפלא, עד כמה שאני זוכר נראה לי שמעולם לא נתקלתי בבעיה.
אתה עם VS מעודכן? אצלי זה 15.3.1, והגירסה האחרונה היא כבר 15.3.3 (יצאה לפני שבוע בדיוק). אם זה לא מעודכן לך כנס לTools > Extension And Update ושם בUpdate בחר בזה של הVS.תודה בקשר ללוגו ואתה מעיז עוד לקטר על הVS2017...
פורסם במקור בפורום CODE613 ב05/09/2017 16:28 (+03:00)
-
@דוד ל.ט.
מאוד מתפלא, עד כמה שאני זוכר נראה לי שמעולם לא נתקלתי בבעיה.
אתה עם VS מעודכן? אצלי זה 15.3.1, והגירסה האחרונה היא כבר 15.3.3 (יצאה לפני שבוע בדיוק). אם זה לא מעודכן לך כנס לTools > Extension And Update ושם בUpdate בחר בזה של הVS.לא הכרתי את זה..
גרסה 15.0.26730.3
כנראה שאני ממש ענתיקה.. רץ לעדכן :lol:פורסם במקור בפורום CODE613 ב05/09/2017 19:52 (+03:00)