סריאליזציה של אובייקטים שנוצרו ע"י LINQ to SQL
במצבים מסויימים, נרצה לעשות serialization לאיזשהם אובייקטים שיוצרו ע"י LINQ to SQL. במילים אחרות, לקחת את האובייקטים שמופו מהטבלאות ולעשות להם סריאליזציה, למשל, כדי לשלוח אותם במסגרת Web Service. השגיאה עליה אני מדבר, תקרה בעיקר באובייקטים שמופו שיש להם realationships עם אובייקטים אחרים. ה Exception, ייראה בערך ככה:
System.InvalidOperationException: A circular reference was detected while serializing an object of type BL.User.
השגיאה הזאת נובעת, בגלל הצורה שבה ממומשים ה realationships בין האובייקטים. כל אובייקט שמופה ויש לו relationship עם טבלה אחרת יש לו property שבו הוא מחזיר את האובייקט אליו הוא מופה. במילים אחרות - באובייקט User יש property שמחזיר אובייקט UserInSite. עד פה, הכל בסדר.
הבעייה מתחילה באובייקט UserInSite. הבעייה היא, שגם לו יש relationship עם User. וגם לו יש property שמחזיר, נחשו מה, אובייקט User. וזה, מה שקוראת לו השגיאה - circular reference. במקרה כזה, נרצה לבטל את המעגל הזה.
אין צורך לוותר על ה relationship עצמו, צריך רק להוריד כיוון אחד.
מה שיש לעשות, זה לשים את האטריביוט [NonSerialized] מעל להצהרה בקובץ קוד של ה LINQ to SQL data classes (הקובץ שמסתיים ב .designer.cs).
אפשרות נוספת, היא להפוך את ה property ל internal, וכך הוא לא יעבור serialization. את זה עושים (כדי שלא יידרס) בדרך הבאה:
בחלון של המודל, לחצו על ה relationship המבוקש, בחלון ה properties, ב child property ב access תבחרו internal.
בכל מקרה, אחת משתי הדרכים הללו תגרום לכך שלא יהיה circular reference.
ובא לציון גואל וסריאליזציה ליעקב (גם אם הוא ממופה ב LINQ to SQL ויש לו relationship לאובייקט אחר).