יש לי מחלקת רפוזיטורי שמטפלת בשמירה ועדכון האובייקטים בדטהבייס.
יש לי קוד שעבד מצויין עד היום (כך לפחות זכור לי <!-- s:-) --><img src="{SMILIES_PATH}/icon_e_smile.gif" alt=":-)" title="מחייך" /><!-- s:-) -->), ומשום מה עכשיו אני מקבל את השגיאה הנ"ל:
An entity object cannot be referenced by multiple instances of IEntityChangeTracker.
שפירושה בעברית: שא"א לשייך את אותו אובייקט למספר מופעים של הDB.
המטרה שלי היא לעדכן אובייקט, שיש לו כמה ג'ויינים: כלומר איש קשר, שיש לו מאפיין שמכיל מידע מטבלת הכתובות, ומאפיין של כל המידע מטבלת הטלפונים, ומאפיין של כל הקטגוריות שזה גם טבלה בפני עצמה.
לשם כך כתבתי את הקוד הבא:
var donorVM = objUI as DonorVM;
var donor = db.Donors.Include(d => d.Addresses)
.Include(d => d.Communications)
.Include(d => d.Categories)
.Where(d => !d.Trash && d.Id == donorVM.Id)
.FirstOrDefault();
if (donor == null) return null;
MapAllObjUIToDAL(donorVM, ref donor);
//עד כאן: עדכנתי את האובייקט ששלפתי מהDB מהאובייקט שהגיע מהUI, ושמרתי אותו בDB
db = new Model();
//יצרתי מופע חדש של מחלקת המודל - כיון שאחרת הייתי מקבל שגיאה - ורק ככה זה עבד
//הקוד הבא מעדכן את הסטייט של כל הinner joinים שהוא השתנה או נוסף, כדי שהאנטיטי ידע לעדכן גם אותם (כיון שהם שייכים לטבלאות אחרות
db.Entry(donor.Addresses.First()).State = EntityState.Modified;
foreach (var communic in donor.Communications)
{
db.Entry(communic).State = communic.Id == 0 ? EntityState.Added : EntityState.Modified;
}
foreach (var categ in donor.Categories)
{
db.Entry(categ).State = categ.Id == 0 ? EntityState.Added : EntityState.Modified;
}
db.Entry(donor).State = EntityState.Modified;
await db.SaveChangesAsync();
return donorVM;
כנראה ששורה 11 זורקת את השגיאה, אם כי בלעדיה אני מקבל את השגיאה הבאה:
Saving or accepting changes failed because more than one entity of type 'ContactApp.DAL.Model.Address' have the same primary key value. Ensure that explicitly set primary key values are unique. Ensure that database-generated primary keys are configured correctly in the database and in the Entity Framework model. Use the Entity Designer for Database First/Model First configuration. Use the 'HasDatabaseGeneratedOption" fluent API or 'DatabaseGeneratedAttribute' for Code First configuration.
ולמיטב זכרוני כדי לפתור זאת הוספתי את שורה 11, דהיינו יצרתי מופע חדש של הDB והכל בא על מקומו בשלום.
אבל כנראה שלא...
אשמח לשמוע מה הטעות שלי ואיך ניתן לתקן זאת..
תודה רבה רבה לכולם מראש!!
פורסם במקור בפורום CODE613 ב14/11/2017 01:39 (+02:00)