1394/08/22 23:32 آموزش مقدماتی EntityFramework
حاجی شریفی
مؤسس سایت
 
سلام
قصد دارم یک آموزش ساده از نحوه استفاده از Microsoft Entity Framework ارائه دهم.
EF یک ORM(O bject R elational M apping) است که امکان تبادل اطلاعات بین دیتابیس و #C را میدهد.
در واقع شما با استفاده صحیح از EF میتوانید اطلاعات برنامه خودتان را در انواع دیتابیس ها ذخیره کنید.
به کمک EF به راحتی امکان استفاده از دیتابیس های SQLServer و Oracle و PostgreSQL و MySQL و... وجود دارد.
EF از دوروش برای ارتباط با دیتابیس پشتیبانی میکند، روش Model First و روش Code First .
روش اول روی ایجاد ارتباط با دیتابیس با عناصر گرافیکی و ویزاردها تاکید بیشتری دارد و روش دوم انجام ارتباط با کدنویسی تاکید دارد.
طبق شواهد روش دوم مورد مقبولیت و پذیرش بیشتری واقع شده و در این تاپیک هم ما به این شیوه ارتباط خواهیم پرداخت.

1394/08/22 23:46 بخش اول
حاجی شریفی
مؤسس سایت
 
در حال حاضر قصد داریم در ساده ترین شکل ممکن اطللاعاتی را از دیتابیس SQLServer خوانده و نوشته و حذف و ویرایش کنیم.
انشاا... در صورت ایجاد فرصت به بحث و تشریح و مثال با سایر دیتابیس ها هم خواهم پرداخت.


دیتابیس ما یک جدول و شش ستون دارد:

CREATE TABLE Person
(
   PersonID     int IDENTITY(1,1) NOT NULL PRIMARY KEY,
   Title        nvarchar(8)  NULL,
   FirstName    nvarchar(50) NOT NULL,
   MiddleName   nvarchar(50) NULL,
   LastName     nvarchar(50) NOT NULL,
   ModifiedDate datetime     NOT NULL
);

پروژه را با ایجاد یک Console Application ساده شروع میکنیم.
MENU: File > New > Project
دقت کنید که نسخه dotNet Framework حداقل 4.5 (یابالاتر) باشد.



برای نصب و افزودن EF میتوان از کنسول NuGet استفاده کرد.
NuGet سایتی متشکل از ده ها هزاران بسته رایگان نرم افزاری است که با VS هم تجمیع شده.
شما میتوانید با استفاده از فرمان منویی زیر وارد کنسول خط فرمان NuGet شوید.
MENU: Tools > NuGet Package Manager > Package Manager Console



برای نصب و افزودن EF به پروژه تان اول از اتصال اینترنت مطمئن شوید و سپس در Package Manager Console فرمان زیر را تایپ و Enter کنید.

Install-Package EntityFramework
یا
Install-Package EntityFramework -Version 6.1.3

فرمان اول، آخرین نسخه کامل EF را نصب میکند
و فرمان دوم، نسخه خاص 6.1.3 را نصب میکند.
در زمان نگارش این متن، آخرین نسخه 6.1.3 بوده و دوفرمان فوق یک عمل واحد انجام میدهند.
باتوجه به آنکه شاید تغییرات در نسخه آتی 7 بوجود بیاید، بدلیل هماهنگی با این آموزش پیشنهاد میشود از فرمان دوم استفاده کنید تا نسخه 6.1.3 نصب شود و با پیشروی طبق این آموزش خطا و ناهماهنگی رخ ندهد.
(ولی در نهایت حتما تلاش کنید دانش خود را بروز نگاه دارید و بتوانید از نسخه هایی نهایی و پیشرفته تر استفاده کنید)


پس از Enter کردن فرمان، نسخه مناسب EF از سایت دانلود شده و به پروژه تان افزوده میشود.
اگر همه چیز خوب پیش برود در انتها پیام Successfully را باید مشاهده کنید.
دقت کنید که در زمان دانلود و نصب اتصال اینترنت لازم است ولی پس از افزوده شدن به پروژه دیگر اتصال اینترنت لازم نخواهد بود.
(درصورت تمایل، میتوانید نسخه دانلود شده در را پوشه Packages\EntityFramework.6.1.3 کنار محل پوشه اصلی برنامه مشاهده کنید)



درادامه یک دیتابیس جدید با جدول و فیلدهای مورد نظر به پروژه اضافه کنید.
از شرح و بست این قسمت صرفنظر میکنیم، فرض میکنم خوانندگان عزیز با چگونگی ساخت یک دیتابیس و جدول ساده آشنا هستند و تمرکز خود را روی EF معطوف خواهم کرد.

1395/02/13 22:0
حاجی شریفی
مؤسس سایت
 
سلام
پیش از این گفتیم که ORM به نگاشت اشیای دیتابیس به اشیای درون برنامه اشاره دارد، پس در یک ORM ما نیاز به تعریف بخشی معادل جداول و فیلدهای دیتابیس درون برنامه مان داریم تا کتابخانه و موتور ORM بتواند مقادیر دیتابیس را درون اشیا ما نگاشت یا منتقل کند و تغییرات ما در آن اشیا را بطور معکوس در دیتابیس اعمال کند.

برای این امر در EF نیاز به تعریف یک کلاس Entity ساده (POCO) با نام فیلدها و مشابه Type آن ها در دیتابیس داریم.

این کلاس برای جدول Person که در پست قبل فیلدهایش را معرفی کردیم، بدین شکل خواهد بود:
[Table( "Person" )]
public class Person
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int PersonID { get; set; }
public string Title { get; set; }
public string FirstName { get; set; }
public string MiddleName { get; set; }
public string LastName { get; set; }
public DateTime ModifiedDate { get; set; }
}


- ویژگی Table در کد فوق نام واقعی دیتابیس را مشخص میکند.
- ویژگی Key هم مشخص کننده PrimaryKey واقعی جدول است، این ویژگی تنها مورد اجباری است، یعنی وجود آن دریکی از فیلدهای کلاس Entity شما اجباری است.
- ویژگی DatabaseGenerated هم با مقدار Identity مشخص میکند که این فیلد AutoNumber است، یعنی به EF اعلان میکند که در زمان Insert شاید مقدار صفر داشته باشد ولی پس از Insert خودکار در دیتابیس عددی خواهد گرفت و EF باید این تغییرات را لحاظ کند.
- ویژگی های بسیار دیگری وجود دارد که نحوه نگاشت صحیح را کنترل میکنند که در این مقاله از بیان آنها صرف نظر میکنیم.

دقت کنید که نام ونوع Property های این کلاس با نام و نوع ستون های جدول دیتابیس مان منطبق است.

class Person که در کد فوق تعریف کردیم در واقع معادل نگاشت وانتقال یک سطر جدول دیتابیس است وهر Property این کلاس هم معادل یک ستون در دیتابیس است.
پس تا اینجا وبا تعریف یک کلاس ساده (POCO) نگاشت ستون ها ویک سطر دیتابیس را به سادگی انجام دادیم، میماند نگاشت خود یک چیزی برای معادل جدول بودن و یک چیزی برای معادل دیتابیس بودن.
دقت کنید که class Person معادل یک سطر است درحالیکه جدول (یک سطح بالاتر) شامل تعداد بیشماری سطر است.

برای معادل سازی دیتابیس وجداول تعریف یک کلاس دیگر هم لازم است:
public class DBUnit
: DbContext
{
public DBUnit()
: base( "MyConnection" )
{
}

public DbSet<Person> Persons { get; set; }
}
و کار نگاشت تمام است! بسیار ساده ، کارآمد و لذت بخش است.
اجازه دهید ببینیم چه نوشته ایم؟

DbSet یک مجموعه سفارشی در EF است که معادل یک جدول میشود.
همانطورکه گفتیم جدول مجموعه سطرها است و DbSet هم مجموعه ای از نمونه های class Person است.
پس ما نیاز داریم برای هر جدول یک DbSet در این کلاس اضافه کنیم، دقت کنید که نام Persons در اینجا مهم نیست و میتوانست هر نام دیگری که ما با آن راحت بودیم باشد، EF از این نام استفاده نمیکند.

کلاس وراثت گرفته شده از DbContext هم در اینجا نقشی معادل نگاشت کل دیتابیس را برای ما ایفا میکند.
اگر دقت کنید یک دیتابیس در بانک اطلاعاتی شامل چندین جدول است و در اینها هم کلاس DbContext ما میتواند شامل چندین DbSet باشد.

==============

نکته دیگری که باقی می ماند، محتوا رشته ConnectionString است که ماهیت آن معرف دوستان است.
(ConnectionString یک رشته تنظیمی است که حداقل شامل چهار مقدار اصلی است: آدرس سرور دیتابیس، نام بانک اطلاعاتی و نام کاربری و گذرواژه اتصال به دیتابیس است)
کلمه "MyConnection" معرف کلید دسترسی به ConnectionString در فایل app.config (پروژه exe) یا فایل web.config (پروژه asp.net) است.
این مورد چیز جدیدی نیست و روشی استاندارد قبل از EF است که در EF مدون تر شده است.
فرمت فایل config.* باید چیزی شبیه این باشد:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="MyConnection" providerName="System.Data.SqlClient" connectionString="Data Source=IP ;Initial Catalog=DATABASE ;User ID=USERNAME ;Password=PASSWORD " />
</connectionStrings>
...

(فقط جهت اطلاع، این مورد ConnectionString کمی در ASP.Net Core 1 و EF7 تفاوت کرده که البته هنوز در محدوده آزمایشی است)

==============

تا این مرحله ما موفق شدیم معادل ها یا نگاشت هایی برای مفاهیم ستون، سطر، جدول وکل دیتابیس مان در کدهایمان ایجاد کنیم.
از اینجا به بعد ما با این معادل ها کار میکنیم، آنها را میخوانیم ، تغییر میدهیم و اضافه میکنیم و... و EF بین ما ودیتابیس قرار میگیرد و خودکار دستورات SQL لازم جهت چهار عمل اصلی CRUD را ساخته (INSER, SELECT, UPDATE, DELETE) و اجرا میکند.

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