X
تبلیغات
نماشا
رایتل

در بخشهای قبلی در مورد کلاس  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();

          

}


ادامه دارد ...