صفحه شخصی سید علا سبزپوش

برنامه نویس دات نت و sql_server --ریاضیات

صفحه شخصی سید علا سبزپوش

برنامه نویس دات نت و sql_server --ریاضیات

Entity Framework 4 part ۱۴

در بخش قبل در مورد ساختار و نحوه لود شدن اشیا در cash  صحبت کردم اکنون در این بخش در مورد سه عمل ، حذف ،اضافه و تغییر در داده ها صحبت می کنم .

Updating Entities

به مدل کلاسها مثالهای قبل نگاهی بیندازید تا بر اساس آن دستورات آپدیت را اعمال کنیم ، روال کار بسیار ساده است .فرض کنیم در جدول  order  برای رکوردی که Id  آن برابر شماره 43680  می خواهیم مقادیر فیلدهای Status  و فیلد RevisionNumber  را تغییر دهیم . روال کار بسیار ساده است به ه مثال زیر دقت کنید که چگونه ابتدا رکورد مورد نظر ما بازیابی می شود و سپس مقادیر آن تغییر می کند .

int orderId = 43680;

 

            using (AdventureWorksEntities context =

                new AdventureWorksEntities())

            {

                var order = (from o in context.SalesOrderHeaders

                             where o.SalesOrderID == orderId

                             select o).First();

 

                order.Status = 6;

                order.RevisionNumber = 123;

                context.SaveChanges();

 

            }

 

Adding Entities

اضافه کردن رکورد نیز مشابه روال بالا است با این تفاوت که شما اینجا باید یک متغیر از نوع کلاس مورد نظر ایجاد کنید مثلا اگر می خواهیم رکوردی را به جدول Address اضافه کنیم ابتدا باید متغیری از نوع کلاس Adress تعریف کنیم و پس از مقدار دهی به عناصر این کلاس باید متغیر نوع کلاس را به مجموعه addresses  از شی objectContext اضافه کنیم مانند مثال زیر :


using (AdventureWorksEntities context =

                new AdventureWorksEntities())

            {

                Address ad = new Address();

                ad.AddressLine1 = "add11";

                ad.AddressLine2 = "add21";

                ad.City="tehran2";

                ad.StateProvinceID=79;

                ad.PostalCode = "98011";

                ad.rowguid = Guid.NewGuid();

                ad.ModifiedDate = DateTime.Now;

                context.Addresses.AddObject(ad);

             

                context.SaveChanges();

 

            }

 

 

Deleting Entities

عمل حذف نیز بسیار شبیه به عمل ثبت تغییرات است ، ابتدا رکورد یا مجموعه رکوردهایی مشخص را بازیابی می کنیم و سپس دستور حذف را بر روی شی ObjectContext اعمال می کنیم .

در مثال زیر می خواهیم رکوردی را از جدول address را که addressed=325  را حذف کنیم .

 

using (AdventureWorksEntities context =

                new AdventureWorksEntities())

            {

                var add = (from o in context.Addresses

                           where o.AddressID == 325

                             select o).First();

 

                context.DeleteObject(add);

                context.SaveChanges();

 

            }

 

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

Entity Framework 4 part ۱۳

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

          

}


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

Entity Framework 4 part ۱۲

Entity SQL part 3

Using Entity SQL with the EntityClient provider

EntityClient   یک  ارایه دهنده ابزاری است برای ایجاد تعامل با مدل مفهومی داده ها است .این ارایه دهنده بسیار شبیه به ابزار SQLClient   در ADO.Net  است .اگر از قبل با SQLClient  کار کرده باشید فراگیری EntityClient  برای شما به مراتب ساده تر خواهد بود . در اینجا اشاره ای می کنم به مهمترین عناصر فضای نام EntityClient

1-      EntityConnection  : این شی بسیار شبیه به شی Sqlconnection  میباشد .  با این تفاوت که EntityClient  شامل رشته اتصال به مدل داده ها است در حالیکه SqlConnection  شامل رشته اتصال به بانک اطلاعاتی است .

2-      ایجاد کویری  EntityCommand

وقتی رشته اتصال با مدل داده ایجاد می شود ، پس از آن شما برای اجرای کویری خود بر اساس مدل داده ها ، نیاز به شی EntityCommand  دارید ، شما به واسطه این شی می توانید انواع کویریها را بر روی مدل داده ها اجرا کنید .

3-پیمایش داده ها EntityDataRedear

اگر شما بخواهید داده های خود را از شی EntityCommand  را بصورت داده های فقط خواندنی و بصورت رکوردهای پیمایشی ایجاد کنید این شی کمک فراوانی به شما می کند .

اکنون بر اساس مدل داده های مثال قبل یک کویری جدید بر اساس EntityClient  ایجاد می کنیم تا بهتر متوجه تفاوت این دو روش شویم .

ابتدا حتما فضای نام system.Data.EntityClient  را حتما وارد کنید و سپس سورس زیر را اعمال کنید .

 

   


               

var firstname = "";

 var lastname = "";

using (EntityConnection conn = new EntityConnection("name = AdventureWorksEntities"))

                 {

  conn.Open();

  var query = "SELECT p.FirstName, p.LastName FROM AdventureWorksEntities.Contacts " +

               " AS p  Order by p.FirstName";

EntityCommand cmd = conn.CreateCommand();

cmd.CommandText = query;

 

using (EntityDataReader rdr= cmd.ExecuteReader(System.Data.CommandBehavior.SequentialAccess))

 {

 while (rdr.Read())

{

firstname = rdr.GetString(0);

lastname = rdr.GetString(1);

Console.WriteLine(string.Format("{0} {1}", firstname, lastname));

}

 }

                     conn.Close();

                 }



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