Delete Entity – Entity Framework (4.0 – 4.1)

30 באוקטובר 2011

אין תגובות


 


העבודה עם 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)

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *