در بخشهای قبلی در مورد کلاس ObjectContext صحبت کردیم .وقتی ما یک مدل طراحی می کنیم این مدل ما کلاسی دارد که از کلاس ObjectContext ارث بری می کند .کلاس objectContext در خصوصیات خود به کلاس دیگری به نام ObjectStateManager دسترسی دارد . این کلاس ObjectStateManager به طور مستقیم استفاده نمی شود و باید حتما از طریق کلاس ObjectContext به آن دسترسی پیدا کنیم . کلاس ObjectStateManager مدیریت عملیات تغییر ، حذف و ایجاد اشیا کلاس را انجام می دهد .
نکته مهم این است که برای هر شی ObjectContext فقط یک شی ObjectStateManager ایجاد می شود .در واقع این دو کلاس در تناظر یک به یک با یکدیگر هستند .علاوه بر این کلاس ObjectContext برای هر کدام از موجودیتهای خود یعنی Entity های موجود در خود یک کلاس ObjectStateEntry نیاز دارد .
به شکل زیر دقت کنید :
شکل بالا تصویری دقیقتر از یک مدل کلاس و کلاسهای مطرح شده در بالا است ، تصویر بالا بر دو بخش است . بخش فوقانی تصویر نمایی از یک مدل کلاس است اما تصویر پایین در برگیرنده همان کلاسهایی که در بالا ذکر شد.
وقتی یک مدل کلاس ایجاد می شود داده های این مدل در cash قرار می گیرند cash مربوط به کل مدل کلاس ما همان شی ObjectStateManager است . این در واقع ظرفی است برای تماس موجویتهای دیگر مدل کلاس ما . همچنین هر کدام از موجودیتها Entity ها در cash متناظر خود که همان کلاس ObjectStateEntry لود می شود . در شکل بالا می بینیم که برای موجودیت هر جدول و کلاس ما ، یک Cash با نوع کلاس ObjectStateEntry ایجاد شده است . این کلاس دارای چند آیتم مهم است که در زیر مختصرا ذکر می کنم .
1-EntityState در واقع حالت یک موجودیت را بیان می کند و مقادیر زیر را می گیرد .
Detached : شی وجود دارد اما قابل ردیابی نیست . در واقع موجودیت ایجاد شده اما بعدا اتصال آن با شی ObjectContext قطع می شود.
Unchanged : شی ما قابلیت تغییر را ندارد.
Added : در واقع شی موجودیت به کلاس ObjectContext اضافه می شود .
Deleted : شی موجودیت از کلاس objectContext حذف می شود .
Modified : برخی از مقادیر شی ما دچار تغییر شده اند.
2-Entity : همانطور که در شکل بالا می بینید نشان دهنده شی یا موجودیت مرتبط با ObjectStateEntry
3-EntityKey : کلید ارجاع و منحصر به فرد کلاس ها است که برای هر کدام از اشیا باید منحصر به فرد باشد .
4- original value : وقتی برای اولین با یک موجودیت ایجاد می شود یک تصویر اولیه از آن در cash ایجاد می شود که شامل مقادیر اصلی همان موجودیت است .
5-current value : وقتی مقادیر موجویت در cash تغییر پیدا کنند . قبل از انکه به بانک اطلاعاتی منتقل شوند .مقادیر فعلی را نشان می دهد که در cash قرار دارند .
مثال زیر مفهوم ، تعاریف بالا را و فرق مقادیر اصلی و فعلی را نمایش میدهد.این مثال بر پایه همان مدل کلاس مثالهای قبل تدوین شده است .
int orderId = 43680;
using (AdventureWorksEntities context =
new AdventureWorksEntities())
{
var order = (from o in context.SalesOrderHeaders
where o.SalesOrderID == orderId
select o).First();
// Get ObjectStateEntry from EntityKey.
ObjectStateEntry stateEntry =
context.ObjectStateManager.GetObjectStateEntry(((IEntityWithKey)order).EntityKey);
//Get the current value of SalesOrderHeader.PurchaseOrderNumber.
CurrentValueRecord rec1 = stateEntry.CurrentValues;
string oldPurchaseOrderNumber =
(string)rec1.GetValue(rec1.GetOrdinal("PurchaseOrderNumber"));
//Change the value.
order.PurchaseOrderNumber = "12345";
string newPurchaseOrderNumber =
(string)rec1.GetValue(rec1.GetOrdinal("PurchaseOrderNumber"));
// Get the modified properties.
IEnumerable<string> modifiedFields = stateEntry.GetModifiedProperties();
foreach (string s in modifiedFields) Console.WriteLine("Modified field name: {0}\n Old Value: {1}\n New Value: {2}",s, oldPurchaseOrderNumber, newPurchaseOrderNumber);
// Get the Entity that is associated with this ObjectStateEntry.
SalesOrderHeader associatedEnity = (SalesOrderHeader)stateEntry.Entity;
Console.WriteLine("Associated Enity's ID: {0}", associatedEnity.SalesOrderID);
Console.ReadKey();
}
ادامه دارد ...