Delete Entity - Entity Framework (4.0 - 4.1)
העבודה עם Entity Framework הקילה עלינו את החיים וחסכה מאיתנו את הצורך לכתוב שכבת DAL.
אחד הדברים שהיינו דואגים לעשות ב - DAL היה למחוק שורה במידה והקשר נמחק - כלומר במידה ויש לנו אובייקט Company המכיל הצבעה לאובייקט Hit, במידה והקשר נמחק (כלומר Company מצביע ל - Hit אחר) ה - Hit המקורי אמור להמחק.
ב - Entity Framework גרסה 4.0 זה די פשוט.
ראשית נמצא את האובייקט שנרצה למחוק
var obj = context.Companies.First().Hit;
כעת במידה והקשר מוגדר EndOnDelete - Cascade (ב - designer של Entity Framework על הקשר) חייבים לפני המחיקה למחוק ידנית את הקשר (אחרת זה ימחק גם את ה - Company)
context.Companies.First().Hit = null;
במידה וזה מוגדר ב - none ניתן לדלג על שורה זו.
כעת רק צריך למחוק את האובייקט באחד מהדרכים הבאות:
context.DeleteObject(obj);
context.Hits.DeleteObject(obj);
וכעת רק צריך לשמור.
ב - Entity Framweork 4.1 זה קצת יותר מסובך, אין לנו פונקצייה בשם Delete, על ה - context.
יש לנו על אובייקט מסוג Set פונקציית Remove, אבל בדרך כלל כשנעבוד עם Entity Framework 4.1 לא נחשוף את כל האובייקטים כ - Set אלא רק את אלו שמוגדרים כ - Entitiy - (לדוגמא כשנעבוד ב - DDD).
לכן נוכל להשתמש בפונקציות הבאות:
public void ChangeState(object entity, EntityState state)
{
if (entity != null)
{
var entry = Entry(entity);
entry.State = state;
}
}
public void DeleteObject(params object[] entities)
{
foreach (var item in entities)
{
ChangeState(item, EntityState.Deleted);
}
}
הפונקציה ChangeState יודעת לקבל אובייקט וה - State החדש שלו, היא משתמשת בפונקציה Entry של DbContext כדי לקבל אובייקט של Entity Framework והיא משנה לו את ה - State.
הפונקציה DeleteObject מקבלת מערך של אובייקטים ומפעילה על כל אחד מה את ChangeState.
ברור שבמידה ואנחנו מוחקים אובייקט שאנחנו חושפים לו Set מתוך ה - Context נוכל להשתמש בפונקציית Remove