DCSIMG
Delete Entity - Entity Framework (4.0 - 4.1) - שלמה גולדברג (הרב דוטנט)

שלמה גולדברג (הרב דוטנט)

מרצה בסלע ויועץ בעולם ה - net.

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);

 
וכעת רק צריך לשמור.
 

context.SaveChanges();

 
 
ב - 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
 

Companies.Remove(obj)

שלח תגובה

(שדה חובה)  

(שדה חובה)  

(אופציונלי)

(שדה חובה) 

Please add 1 and 3 and type the answer here:


Enter the numbers above: