بهرهگیری از یک تابع پویا برای افزودن، ویرایش
در مثالهای گذشتهدیدید که برای هر کدام از عملهای درج، ویرایش و حذف، تابعهای مختلفی نوشته بودیم که اینکار هنگامیکه یک پروژهی بزرگ در دست داریم زمانبر خواهد بود. چه بسا یک جدول بزرگ داشته باشیم و بخواهیم در هر فرمی، ستون یا ستونهای خاص بهروزرسانی شوند. برای رفع این نگرانی افزودن تابع زیر به سرویسمان گرهگشا خواهد بود.
public bool AddOrUpdateOrDelete<TEntity>(TEntity newItem, bool updateIsNull) where TEntity : class { try { var dbMyNews = new dbMyNewsEntities(); if (updateIsNull) dbMyNews.Set<TEntity>().AddOrUpdate(newItem); else { dbMyNews.Set<TEntity>().Attach(newItem); var entry = dbMyNews.Entry(newItem); foreach ( var pri in newItem.GetType().GetProperties() .Where(pri => (pri.GetGetMethod(false).ReturnParameter.ParameterType.IsSerializable && pri.GetValue(newItem, null) != null))) { entry.Property(pri.Name).IsModified = true; } } dbMyNews.SaveChanges(); return true; } catch (Exception) { return false; } }
var news = new tblNews(); news.tblCategoryId = 2; news.tblNewsId = 1; MyNews.EditNews(news);
راهی که برای حل آن استفاده میکردیم، به این صورت بود:
var news = MyNews.GetNews(1); news.tblCategoryId = 2; MyNews.EditNews(news)
در این روش یک رفت و برگشت بیهوده به WCF انجام خواهد شد در حالتی که ما اصلاً نیازی به مقدار ستونهای دیگر نداریم و اساساً کاری روی آن نمیخواهیم انجام دهیم.
در تابع AddOrUpdateOrDelete نخست بررسی میکنیم که آیا اینکه ستونهایی که مقدار ندارند، در جدول اصلی هم مقدار null بگیرند برای ما مهم است یا نه. برای نمونه هنگامیکه میخواهیم سطری به جدول بیفزاییم یا اینکه واقعاً بخواهیم مقدار دیگر ستونها برابر با null شود. در این صورت همان متد AddOrUpdate از Entity Framework اجرا خواهد شد.
حالت دیگر که در حذف و ویرایش از آن بهره میبریم با یک دستور foreach همهی پروپرتیهایی که Serializable باشد (که در این صورت پروپرتیهای virtual حذف خواهد شد) و مقدار آن نامساوی با null باشد، در حالت ویرایش خواهند گرفت و در نتیجه دیگر ستونها ویرایش نخواهد شد. این دستور دیدگاه جزءنگر دستور زیر است که کل موجودیت را در وضعیت ویرایش قرار میداد:
dbMyNews.Entry(news).State = EntityState.Modified;
public int AddNews(tblNews News) { dbMyNews.tblNews.Add(News); dbMyNews.SaveChanges(); return News.tblNewsId; } public bool EditNews(tblNews News) { try { dbMyNews.Entry(News).State = EntityState.Modified; dbMyNews.SaveChanges(); return true; } catch (Exception exp) { return false; } } public bool DeleteNews(int tblNewsId) { try { tblNews News = dbMyNews.tblNews.FirstOrDefault(p => p.tblNewsId == tblNewsId); News.IsDeleted = true; dbMyNews.SaveChanges(); return true; } catch (Exception exp) { return false; } }
public bool AddOrEditNews(tblNews News) { return AddOrUpdateOrDelete(News, News.tblNewsId == 0); }
در سمت برنامه از این تابع برای عمل درج، ویرایش و حذف به سادگی و بدون نگرانی استفاده میکنید. برای نمونه جهت حذف در یک خط به این صورت مینویسید:
MyNews.AddOrEditNews (new tblNews { tblNewsId = 1, IsDeleted =true });