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