اندازهی قلم متن
تخمین مدت زمان مطالعهی مطلب:
چهار دقیقه
براى استفاده از کلاسهاى Entity که در نوشتار پیشین ایجاد کردیم در WCF باید آن کلاسها را دستکارى کنیم. متن کلاس tblNews را در نظر بگیرید: مشاهده میکنید که برای تعریف کلاسها از کلمه کلیدی partial استفاده شده است. استفاده از کلمه کلیدی partial به شما اجازه میدهد که یک کلاس را در چندین فایل جداگانه تعریف کنید. به عنوان مثال میتوانید فیلدها، ویژگى ها و سازندهها را در یک فایل و متدها را در فایل دیگر قرار دهید.
با انجام کد بالا از بابت مدل کارمان تمام شده است. ولی فرض کنید در اینجا تصمیم به تغییری در پایگاه داده میگیرید. برای نمونه میخواهید ویژگی Allow Nulls فیلد IsDeleted را نیز False کنیم و مقدار پیشگزیده به این فیلد بدهید. برای این کار باید دستور زیر را در SQL Server اجرا کنیم:
پس از آن مدل Entity Framework را باز کنید و در جایی از صفحه راستکلیک کرده و از منوی بازشده گزینه Update Model from Database را انتخاب کنید. سپس در پنجره بازشده، چون هیچ جدول، نما یا روالی به پایگاه دادهها نیفزوده ایم؛ دگمهی Finish را کلیک کنید. دوباره کلاس tblNews را بازکنید. متوجه خواهید شد که همهی DataContractها و DataMemberها را حذف شده است. ممکن است بگویید میتوانستیم کلاس یا مدل را تغییر دهیم و به وسیلهی Generate Database from Model بههنگام کنیم. ولی در نظر بگیرید که نیاز به ایجاد چندین جدول دیگر داریم و مدلی با دهها Entity دارید. در این صورت همهی تغییراتی که در کلاس داده ایم زدوده خواهد شد.
namespace MyNewsWCFLibrary { using System; using System.Collections.Generic; public partial class tblNews { public int tblNewsId { get; set; } public int tblCategoryId { get; set; } public string Title { get; set; } public string Description { get; set; } public System.DateTime RegDate { get; set; } public Nullable<bool> IsDeleted { get; set; } public virtual tblCategory tblCategory { get; set; } } }
به صورت خودکار کلیهى ویژگىها به توجه به پایگاه داده ساخته شده اند. براى نمونه ما براى فیلد IsDeleted در SQL Server ستون Allow Nulls را کلیک کرده بودیم که در نتیجه در اینجا عبارت Nullable پیش از نوع فیلد نشان داده شده است. براى استفاده از این کلاس در WCF باید صفت DataContract را به کلاس داد. این قرارداد به ما اجازه استفاده از ویژگىهایى که صفت DataMember را مىگیرند را مىدهد.
کلاس بالا را به شکل زیر بازنویسى کنید:
using System.Runtime.Serialization; namespace MyNewsWCFLibrary { using System; using System.Collections.Generic; [DataContract] public partial class tblNews { [DataMember] public int tblNewsId { get; set; } [DataMember] public int tblCategoryId { get; set; } [DataMember] public string Title { get; set; } [DataMember] public string Description { get; set; } [DataMember] public System.DateTime RegDate { get; set; } [DataMember] public Nullable<bool> IsDeleted { get; set; } public virtual tblCategory tblCategory { get; set; } } }
همچنین کلاس tblCategory را به صورت زیر تغییر دهید:
namespace MyNewsWCFLibrary { using System; using System.Collections.Generic; using System.Runtime.Serialization; [DataContract] public partial class tblCategory { public tblCategory() { this.tblNews = new HashSet<tblNews>(); } [DataMember] public int tblCategoryId { get; set; } [DataMember] public string CatName { get; set; } [DataMember] public bool IsDeleted { get; set; } public virtual ICollection<tblNews> tblNews { get; set; } } }
BEGIN TRANSACTION GO ALTER TABLE dbo.tblNews DROP CONSTRAINT FK_tblNews_tblCategory GO ALTER TABLE dbo.tblCategory SET (LOCK_ESCALATION = TABLE) GO COMMIT BEGIN TRANSACTION GO CREATE TABLE dbo.Tmp_tblNews ( tblNewsId int NOT NULL IDENTITY (1, 1), tblCategoryId int NOT NULL, Title nvarchar(50) NOT NULL, Description nvarchar(MAX) NOT NULL, RegDate datetime NOT NULL, IsDeleted bit NOT NULL ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO ALTER TABLE dbo.Tmp_tblNews SET (LOCK_ESCALATION = TABLE) GO ALTER TABLE dbo.Tmp_tblNews ADD CONSTRAINT DF_tblNews_IsDeleted DEFAULT 0 FOR IsDeleted GO SET IDENTITY_INSERT dbo.Tmp_tblNews ON GO IF EXISTS(SELECT * FROM dbo.tblNews) EXEC('INSERT INTO dbo.Tmp_tblNews (tblNewsId, tblCategoryId, Title, Description, RegDate, IsDeleted) SELECT tblNewsId, tblCategoryId, Title, Description, RegDate, IsDeleted FROM dbo.tblNews WITH (HOLDLOCK TABLOCKX)') GO SET IDENTITY_INSERT dbo.Tmp_tblNews OFF GO DROP TABLE dbo.tblNews GO EXECUTE sp_rename N'dbo.Tmp_tblNews', N'tblNews', 'OBJECT' GO ALTER TABLE dbo.tblNews ADD CONSTRAINT PK_tblNews PRIMARY KEY CLUSTERED ( tblNewsId ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO ALTER TABLE dbo.tblNews ADD CONSTRAINT FK_tblNews_tblCategory FOREIGN KEY ( tblCategoryId ) REFERENCES dbo.tblCategory ( tblCategoryId ) ON UPDATE NO ACTION ON DELETE NO ACTION GO COMMIT
در بخش پسین، دربارهی اینکه چه کنیم که عبارتهایی که به کلاسها میافزاییم حذف نشود؛ خواهم نوشت.