ساخت عملی یک پروژه ASP.NET Core MVC و Entity Framework Core

پرووید

دسته های مقالات

پروژه ‌ای که با استفاده از Entity Framework Core عملیات Data Access را انجام می دهد و از یک دیتابیس که از قبل موجود است (روش Database First) استفاده می‌ کند. برای استفاده کردن از یک دیتابیس که از قبل موجود است و ساختن Entity Framework Model می‌ بایست عملیات مهندسی معکوس یا اصطلاحاً Reverse Engineering انجام دهیم. در رابطه با این موضوع در همین آموزش صحبت خواهیم کرد.

پیش نیازها

برای اینکه بتوانید این آموزش را دنبال کنید نیازمند ویژوال استودیو ۲۰۱۷ و همچنین .NET Core 2.1 SDK می باشید.

ساخت دیتابیس Blogging

در این آموزش ما از یک دیتابیس با نام Blogging استفاده می ‌کنیم. این دیتابیس در واقع جزئیات و اطلاعات مربوط به یک وبلاگ و پست های درون آن وبلاگ را ذخیره میکند. از LocalDb برای ساختن این دیتابیس استفاده می کنیم. خب برای ساختن این دیتابیس ویژوال استودیو را باز کنید و سپس از منوی Tools گزینه Connect to Database را انتخاب کنید. در قسمت بعدی Microsoft SQL Server را انتخاب کنید و سپس بر روی Continue کلیک کنید. به عنوان نام سرور (localdb)mssqllocaldb را وارد کنید سپس به عنوان نام دیتابیس master را وارد کنید و بر روی OK کلیک کنید. دیتابیس master در Data Connections های درون Server Explorer نشان داده می شود.

بر روی این دیتابیس راست کلیک کرده و سپس New Query را انتخاب کنید. کدی که در ادامه می ‌بینید را برای این Query جدید کپی پیست کرده و سپس بر روی این Query راست کلیک کرده و گزینه Execute را کلیک کنید.

 
CREATE DATABASE [Blogging];
GO

USE [Blogging];
GO

CREATE TABLE [Blog] (
    [BlogId] int NOT NULL IDENTITY,
    [Url] nvarchar(max) NOT NULL,
    CONSTRAINT [PK_Blog] PRIMARY KEY ([BlogId])
);
GO

CREATE TABLE [Post] (
    [PostId] int NOT NULL IDENTITY,
    [BlogId] int NOT NULL,
    [Content] nvarchar(max),
    [Title] nvarchar(max),
    CONSTRAINT [PK_Post] PRIMARY KEY ([PostId]),
    CONSTRAINT [FK_Post_Blog_BlogId] FOREIGN KEY ([BlogId]) REFERENCES [Blog] ([BlogId]) ON DELETE CASCADE
);
GO

INSERT INTO [Blog] (Url) VALUES
('http://blogs.msdn.com/dotnet'),
('http://blogs.msdn.com/webdev'),
('http://blogs.msdn.com/visualstudio')
GO

این موضوع باعث ساخته شدن دیتابیس جدیدی با نام Blogging و جداولی با نام‌ های Blog و Post و وارد کردن مقادیر نمونه ای در درون این دیتابیس می ‌شود. در قسمت بعدی نحوه ساختن این پروژه را با یکدیگر بررسی خواهیم کرد.

ساختن یک پروژه جدید

ویژوال استودیو را باز کرده و از منوی File گزینه New و سپس Project را انتخاب کنید. از قسمت سمت چپ بر روی گزینه Installed سپس Visual C# و بعد از آن Web کلیک کنید. از قسمت سمت راست گزینه ی ASP.NET Core Web Application را انتخاب کنید. به عنوان نام این پروژه EFGetStarted.AspNetCore.ExistingDb را وارد کرده و بر روی OK کلیک کنید.

پس از چند ثانیه پنجره New ASP.NET Core Web Application نشان داده می شود. دقت کنید که از درون لیستی که Target Framework را مشخص می کنید گزینه .NET Core را انتخاب کرده و برای انتخاب ورژن ASP.NET Core 2.1 را انتخاب کنید. پس از آن بر روی گزینه ی Web Application (Model-View-Controller) کلیک کرده و Authentication را بر روی No Authentication تنظیم کنید و بر روی OK کلیک کنید. در رابطه با ASP.NET Core در  آموزش شروع به کار برنامه نویسی ASP.NET Core به طور مفصل صحبت کرده ایم.

در قسمت بعدی در رابطه با نصب کردن Entity Framework Core صحبت خواهیم کرد.

نصب کردن Entity Framework Core

به منظور نصب کردن Entity Framework Core باید آن را به عنوان یک Nuget Package نصب کنید. بهترین کار نصب کردن Package مربوط به Database Provider مورد نظر می باشد. برای دیدن یک لیست کامل از Database Provider هایی که در Entity Framework Core پشتیبانی می ‌شوند بر روی این لینک کلیک کنید. در این آموزش ما نیازی به نصب Database Provider یا حتی Entity Framework Core نداریم چرا که داریم از SQL Server به عنوان Database Provider استفاده می کنیم و این Database Provider در متا پکیج Microsoft.AspnetCore.App قرار گرفته است و به صورت خودکار به برنامه ی ما اضافه شده است.

در قسمت بعدی در رابطه با ساخت Model با استفاده از دیتابیس ای که در قسمت های قبلی ایجاد کردیم صحبت خواهیم کرد. این موضوع را تحت عنوان مهندسی معکوس یا Reverse Engineering می نامند. در رابطه با Reverse Engineering کرن دیتابیس در آموزش شروع به کار با Entity Framework Core به طور مفصل صحبت کرده ایم.

ساخت Model با استفاده از دیتابیس

هم اکنون زمان ساختن Model مربوطه بر اساس دیتابیس ای که در قسمت های قبل ایجاد کردیم می باشد. از منوی Toolsگزینه NuGet Package Manager را انتخاب کرده و سپس بر روی Package Manager Console کلیک کنید. دستور زیر را وارد کرده و اجرا کنید:

 
Scaffold-DbContext "Server=(localdb)mssqllocaldb;Database=Blogging;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models

دقت کنید که اگر یک خطا به شکل زیر دریافت کردید:

The term ‘Scaffold-DbContext’ is not recognized as the name of a cmdlet

تنها کاری که نیاز است انجام دهید این است که ویژوال استودیو را ببندید و دوباره باز کنید.

نکته:

میتوانید با استفاده از Argument ای به نام -Tables در دستور Scaffold-DbContext جداولی که قصد دارید از آنها در ساخت Model استفاده کنید را مشخص کنید. برای مثال -Tables Blog,Post باعث ساخته شدن Entity هایی برای دو جدول Blog و Post می شود و بقیه جداولی که احتمالاً در دیتابیس وجود دارند در نظر گرفته نمی‌ شود.

خب با استفاده از این روش ما دو Entity با نام ‌های Blog و Post و همچنین یک کلاس Context با نام BloggingContext را بر اساس Schema بانک اطلاعاتی ایجاد کرده ایم. کدی که در ادامه می بینید Blog را نشان می دهد.

 
using System;
using System.Collections.Generic;

namespace EFGetStarted.AspNetCore.ExistingDb.Models
{
    public partial class Blog
    {
        public Blog()
        {
            Post = new HashSe();
        }

        public int BlogId { get; set; }
        public string Url { get; set; }

        public ICollection Post { get; set; }
    }
}

و کد زیر Post را نشان می دهد:

 
using System;
using System.Collections.Generic;

namespace EFGetStarted.AspNetCore.ExistingDb.Models
{
    public partial class Post
    {
        public int PostId { get; set; }
        public int BlogId { get; set; }
        public string Content { get; set; }
        public string Title { get; set; }

        public Blog Blog { get; set; }
    }
}

نکته ای که قصد داریم در اینجا به اشاره کنیم این است که به منظور فعال کردن قابلیت Lazy Loading باید Navigation Property های درون این Entity ها به صورت virtual تعریف شوند. در ادامه به بررسی کلاس BloggingContext می ‌پردازیم.

کلاس Context نمایانگر یک Session با دیتابیس است و امکان Query گرفتن و Save کردن Entity ها را به ما می ‌دهند. کد زیر تعریف کلاس BloggingContext را نشان می دهد.

 
public partial class BloggingContext : DbContext
{
   public BloggingContext()
   {
   }

   public BloggingContext(DbContextOptions options)
       : base(options)
   {
   }

   public virtual DbSet Blog { get; set; }
   public virtual DbSet Post { get; set; }

   protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
   {
       if (!optionsBuilder.IsConfigured)
       {
           #warning To protect potentially sensitive information in your connection string, you should move it out of source code. See http://go.microsoft.com/fwlink/?LinkId=723263 for guidance on storing connection strings.
           optionsBuilder.UseSqlServer(@"Server=(localdb)mssqllocaldb;Database=Blogging;Trusted_Connection=True;");
       }
   }

   protected override void OnModelCreating(ModelBuilder modelBuilder)
   {
       modelBuilder.Entity(entity =>
       {
           entity.Property(e => e.Url).IsRequired();
       });

       modelBuilder.Entit(entity =>
       {
           entity.HasOne(d => d.Blog)
               .WithMany(p => p.Post)
               .HasForeignKey(d => d.BlogId);
       });
   }
}

رجیستر کردن کلاس BloggingContext در Dependency Injection

امیدواریم که با مفهوم Dependency Injection آشنا باشید. اگر چنین نیست توصیه می‌ کنیم از آموزش معکوس سازی کنترل Inversion of Control در سی شارپ وبسایت پرووید استفاده کنید. مفهوم Dependency Injection یکی از مفاهیم مرکزی و بسیار مهم در ASP.NET Core است. به عبارت دیگر سرویس‌ های مختلفی از قبیل همین کلاس Context در در زمان Application Startup در Dependency Injection رجیستر می شوند و در زمان هایی که به آنها نیاز داریم در دسترس ما قرار می ‌گیرند. این عملیات رجیستر کردن در زمانی که برنامه در حال اجرا شدن است اتفاق می ‌افتد.

پس رجستر شدن کامپوننت های مختلفی که به این سرویس ها نیاز دارند مثلا Controller های برنامه ی MVC این سرویس ‌ها را از طریق تابع سازنده خود و یک پارامتر ورودی دریافت می کنند. در قسمت بعدی کلاس BloggingContext را رجیستر و پیکربندی می ‌کنیم و این کار را در کلاس Startup.cs انجام می دهیم.

Register کردن و Configure کردن BloggingContext در Startup.cs

به منظور اینکه Contoller های MVC بتوانند کلاس Context یعنی همان BloggingContext را دریافت کنند باید این کلاس به عنوان یک سرویس رجیستر شود. به منظور انجام این کار فایل Startup.cs را باز کرده و سپس یک دستورات using زیر را وارد کنید.

 
using EFGetStarted.AspNetCore.ExistingDb.Models;
using Microsoft.EntityFrameworkCore;

با استفاده از اضافه کردن این دو دستور using می ‌توانید از یک متد با نام AddDbContext به منظور رجیستر کردن کلاس Context به عنوان یک سرویس استفاده کنید. خب در ادامه متد ConfigureServices را پیدا کنید و کدی که در قسمت زیر مشاهده می ‌کنید را به قسمت پایانی این متد اضافه کنید:

 
    var connection = @"Server=(localdb)mssqllocaldb;Database=Blogging;Trusted_Connection=True;ConnectRetryCount=0";
    services.AddDbContext(options => options.UseSqlServer(connection));

:نکته

در یک برنامه واقعی اغلب Connection String در یک فایل Configuration یا حتی Environment Variable قرار می گیرد. اما در این آموزش به منظور ساده تر کردن روال کار ما Connection String را به صورت مستقیم در این فایل وارد کرده‌ ایم. در رابطه با جزئیات بیشتر در مورد Connection String ها می توانید از این لینک استفاده کنید. در قسمت بعدی یک Controller و View های مربوط به آن را ایجاد می‌کنیم.

ساخت یک: Controller و View ها

بر روی فولدر Controllers از پروژه خود در Solution Explorer راست کلیک کرده و گزینه Add و سپس Controller را انتخاب کنید. در قسمت بعدی بر روی گزینه ی MVC Controller with views, using Entity Framework کلیک کرده و Ok را انتخاب کنید. گزینه ی Model class را بر روی Blog و Data context class را بر روی BloggingContext تنظیم کرده و بر روی Add کلیک کنید. در ادامه در رابطه با Run کردن این Application صحبت خواهیم کرد.

اجرا کردن: Application

پس از ساختن Controller و View های مربوط به آن می توانید Application را اجرا کنید. از منوی Debug گزینه Start Without Debugging را انتخاب کنید. زمانی که برنامه در مرورگر باز می شود به آدرس /Blogs بروید سپس بر روی گزینه Create New کلیک کنید. یک Url برای Blog خود انتخاب کرده و سپس Create را کلیک کنید. تصویر زیر این موضوع را نشان می دهد.

create index-existing-db

امیدواریم که این آموزش از وبسایت پرووید نیز مورد توجه شما قرار گرفته باشد.

2 Comments

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *