עדכון עם EF מפר הגבלת PK

The new me9

New member
עדכון עם EF מפר הגבלת PK

אני יוצר אובייקט EF חדש.

אני רוצה לעדכן בעזרתו רשומה מסוימת בDB

אני נעזר בקוד הבא:

public MamConfiguration_V1 Save(MamConfiguration_V1 item)
{
item.ThrowIfNull("item");

mMaMDBEntities.MamConfiguration_V1.AddObject(item);

mMaMDBEntities.ObjectStateManager.ChangeObjectState(item, System.Data.EntityState.Modified);

mMaMDBEntities.SaveChanges();

return item;
}

לצערי השורה

mMaMDBEntities.MamConfiguration_V1.AddObject(item);


עושה בעיות כי בהכנסה שלה נפגע חוק ייחודיות של השורה הזו (שלשיה מרכיבה את הPK והוא מופר)

אך למעשה אני רוצה לעדכן שורה קיימת ולא להוסיף חדשה- כך שאני לא מתכנן לשבור את ההגבלה על ייחודיות

איך לשנות את הקוד הנ"ל כדי לא ליפול על זה?

יש דרך בלי לשאוב את האובייקט מהDB, לעדכן שדה שדה שלו באופן ידני ואז לשמור שינויים?
קל לי למלא אובייקט חדש ע"ב המידע שחוזר מהUI
כי זה משהו שאני כבר עושה בפעולה save.
 

nocgod

New member
מזכיר לי מקרה דומה שהיה לי

אתה בטוח שהאובייקט שאתה מנסה לעדכן ולשמור attached ל context שאתה עובד מולו?
ואם האובייקט קיים כבר בDB ואתה מנסה להוסיף אותו שוב זה סוג של אמור לעשות לך בעיות של pk כי אחרי הכל אתה מנסה להכניס אובייקט עם אותו הpk ל db.
 

The new me9

New member
ככה:

הflow הוא כזה:

יש לי form בUI של יצירת product חדש.
אני מקבל בצד השרת. ממלא יישות EF ושומר בDB.
יש לי כבר את הקוד שעושה המרה מitemUI לitemEF.

יצרתי גם flow של edit. הזנתי בטפסי הform את הפרטים של מוצר מסוים. השינויים נשלחים לשרת.

במקום להוציא את הEF שוב מהDB ולעשות השמה שדה-שדה, אני מעדיף להשתמש בקוד הקיים שיוצר לי EF.

ראיתי בSOF שיש דרך לעדכן DB גם עם אובייקט חדש
בלי מנגון הdirtiness:

http://stackoverflow.com/questions/7642570/saving-...

אבהל כאמור זה יוצר בעיה של שבירת uniqueness
 

nocgod

New member
נו יש לך פיתרון לבעיה בלינק...

אתה צריך לעשות או attach לcontext אבל ככה שהEF יוכל למצוא את האובייקט המקורי (או שהאובייקט היה משוייך פעם לקונטקסט והוא נסגר)
או שאתה צריך (וזה לדעתי רעיון יותר נחמד אם אתה לא שומר על קונטקסט) למצוא את האובייקט שלך ב DB למשוך אותו מהקונטקסט לעדכן בהתאם לשינויים ולשמור.

באחת העבודות האחרונות שלי השתמשתי בדרך חדשה בEF, במקום לפתוח ולסגור context כל פעם עשיתי את האובייקט הDB בשכבת הDAL
כסינגלטון ושמרתי את אותו הקונטקסט לאורך ריצת כל התוכנית ככה שכל האובייקטים שאני משתמש בהם במהלך התוכנית מקושרים לקונטקסט ומנוטרים עלידו.
אם תרצה לראות קצת את הרעיון
https://bitbucket.org/nocgod/testing-course-assignment-1/src
הקוד לא "הכי אחי" אבל נראה לי מובן הרעיון הכללי...
 

The new me9

New member
כך גם אני עשיתי

סנגלטון, אבל הערות בSOF אמרו לי שעדיף לא לעשות כך:

תראה את התשובה הראשונה פה
http://stackoverflow.com/questions/3653009/entity-framework-and-connection-pooling/3653392#3653392


לגבי הattachת כן אני חשבתי שזה הפתרון
אחזור למשרד ואראה.

הרעיון ה"יותר נחמד" שלך - הוא אכן יותר נקי, אבל הוא דורש ממני לפתח קוד שדורס property-property של אובייקט קיים

במקום להשתמש בקוד שכבר קיים לי להמרת אובייקט UI לאובייקט EF חדש.
 

nocgod

New member
מאחר וכשאתה מושך דברים מcontext

בEF בתחלס מיוצר לך אובייקט ממחלקה proxy שמייצר לך הEF אולי בגלל זה כשאתה מייצר אובייקט חדש הוא לא יכול לזהות אותו אם הוא היה קיים בDB או לא ולעדכן אותו
לא הבנתי מה הרעיון שלי דורש ממך ? :)
 
למעלה