ایجاد Scaffolding در ASP.Net Core MVC

چهارشنبه 17 خرداد 1396

در این مقاله نحوه استفاده از Entityframework Core به شکل Db-First آموزش داده خواهد شد و پس از آن نحوه ساخت کنترلر و View از طریق Scaffold آموزش داده می شود.

ایجاد Scaffolding در ASP.Net Core MVC

مباحث این مقاله

1- مدیریت  Packageها

2- EF Core Model(DB-First)

3- MVC Core Scaffolding

ابتدا یک پروژه جدید می سازیم.( File > New > Project)

از منوی سمت چپ .Net Core را انتخاب کرده و سپس گزینه ASP.Net Core Web Application را انتخاب کنید.

گزینه Web Application را انتخاب کرده و OK را بزنید.

پس از تایید مرحله قبل پروژه باز می شود و  solution explorer به شکل زیر خواهد بود.

یک دیتابیس جدید با نام PhoneBook بسازید و جدول های داخل دیتابیس را به وسیله query زیر در دیتابیس اضافه کنید.

USE [PhoneBook]
GO

/****** Object:  Table [dbo].[Contacts]    Script Date: 12/9/2016 2:47:49 AM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Contacts](
	[ContactID] [int] IDENTITY(1,1) NOT NULL,
	[FirstName] [nvarchar](50) NULL,
	[LastName] [nvarchar](50) NULL,
	[Phone] [nvarchar](50) NULL,
	[Email] [nvarchar](50) NULL,
 CONSTRAINT [PK_Contacts] PRIMARY KEY CLUSTERED 
(
	[ContactID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

Entity Framework Core

Entity Framework (EF) Core یک تکنولوژی برای دسترسی به داده ها است که برای برنامه های چند سکویی مورد استفاده قرار می گیرد. فایل project.json را باز کنید و بسته هایی که در زیر آمده را در بخش Dependency  و  Tools اضافه کنید.

Dependency Package

//Database Provider for EF Core
"Microsoft.EntityFrameworkCore.SqlServer": "1.0.1",
    
//EF Core Package Manager Console Tools
"Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final",
    
//EF Core Funtionality for MSSQL Server
"Microsoft.EntityFrameworkCore.SqlServer.Design": "1.0.1"

Tools

//Access Command Tools EF Core
"Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final",

EntityFrameworkCore.SqlServer – تامین کننده دیتابیس، این بسته به Entity Framework Core اجازه می دهد که بتواند با Microsoft SQL Server کار کند.

EntityFrameworkCore.SqlServer.Design – این بسته به Entity Framework Core اجازه می دهد که از قابلیت هایش مثل EF Core Migration در Microsoft SQL Server استفاده کند.

EntityFrameworkCore.Tools – یک ابزار Command line برای EF Core که شامل دستورهای زیر است

برای Package Manager Console

1-Scaffold-DbContext

2-Add-Migration

3-Update-Database

برای Command Window

dotnet ef dbcontext scaffold

در این بخش با استفاده از command line، به اجرای چند دستور در برنامه می پردازیم.

به دایرکتوری پروژه بروید و کلید Shift را نگه دارید و راست کلیک کنید وCommand window را باز کنید.

Command

dotnet ef –help

Command

dotnet ef dbcontext scaffold "Server=DESKTOP-5B67SHH;Database=PhoneBook;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer --output-dir Models

در solution explorer می بینیم که در داخل فولدر Model فایل های داخل دیتابیس ساخته شده اند.

کلاس PhoneBookContext به شکل زیر ساخته شده است.

public partial class PhoneBookContext : DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        #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=DESKTOP-5B67SHH;Database=PhoneBook;Trusted_Connection=True;");
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Contacts>(entity =>
        {
            entity.HasKey(e => e.ContactId)
                .HasName("PK_Contacts");

            entity.Property(e => e.ContactId).HasColumnName("ContactID");

            entity.Property(e => e.Email).HasMaxLength(50);

            entity.Property(e => e.FirstName).HasMaxLength(50);

            entity.Property(e => e.LastName).HasMaxLength(50);

            entity.Property(e => e.Phone).HasMaxLength(50);
        });
    }

    public virtual DbSet<Contacts> Contacts { get; set; }
}

آموزش Scaffold در ASP.Net MVC Core

در ورژن های قبلی .Net از امکان scaffold استفاده می کردیم، این قابلیت در .Net Core نیز موجود است، فقط استفاده از آن برای بار اول شاید یک مقدار پیچیده به نظر بیاید. فایل project.json را باز کرده و بسته های زیر را به آن اضافه کنید.

Dependency Package

//Code Generators Package Generate Controller,Views
"Microsoft.VisualStudio.Web.CodeGenerators.Mvc": "1.0.0-preview2-final",
"Microsoft.VisualStudio.Web.CodeGeneration.Tools": "1.0.0-preview2-final"

Tools

//Access Command Tools Code Generation
"Microsoft.VisualStudio.Web.CodeGeneration.Tools": "1.0.0-preview2-final"

فایل را ذخیره کنید و بسته ها به صورت اتوماتیک به برنامه اضافه می شوند. پس از نصب بسته ها، حالا وقت استفاده از scaffold برای ساخت کنترلر ها و View ها است.

استفاده از Scaffold به کمک رابط کاربری

روی فولدر کنترلر راست کلیک کرده و پس از انتخاب ADD گزینه New Scaffolding Item را انتخاب کنید.

گزینه مورد نظر برای scaffold را انتخاب کنید.

حالا model و context را مشخص کرده و شرایط View مورد نظر را هم انتخاب کنید و کلید ADD را بزنید تا این فرآیند کامل شود.

پس از مدتی صبر کردن، در داخل solution explorer می توانیم ببینم که view ها ساخته شده اند.

پیام خروجی به شکل زیر خواهد بود.

C:\Program Files\dotnet\dotnet.exe aspnet-codegenerator --project "E:\Documents\Article\ScaffoldingCoreMVC\CoreMVCScaffolding\src\CoreMVCScaffolding" controller --force --controllerName ContactsController --model CoreMVCScaffolding.Models.Contacts --dataContext CoreMVCScaffolding.Models.PhoneBookContext --relativeFolderPath Controllers --controllerNamespace CoreMVCScaffolding.Controllers --useDefaultLayout
Finding the generator 'controller'...
Running the generator 'controller'...
Attempting to compile the application in memory
Attempting to figure out the EntityFramework metadata for the model and DbContext: Contacts
Added Controller : \Controllers\ContactsController.cs
Added View : \Views\Contacts\Create.cshtml
Added View : \Views\Contacts\Edit.cshtml
Added View : \Views\Contacts\Details.cshtml
Added View : \Views\Contacts\Delete.cshtml
Added View : \Views\Contacts\Index.cshtml
RunTime 00:00:07.87

Scaffold به کمک CommandLine

می توان از طریق CommandLine در پروژه هایمان از Scaffold استفاده کنیم. به دایرکتوری پروژه رفته و کلید Shift را نگه دارید و راست کلیک کنید و command window را انتخاب کنید. برای مشاهده اطلاعات کمکی از دستور زیر استفاده کنید

Command

 dotnet aspnet-codegenerator --help

به کمک دستور زیر که شامل آدرس پروژه و اطلاعات model است می توان کنترلر و View را ساخت.

Command

dotnet aspnet-codegenerator --project "E:\Documents\Article\ScaffoldingCoreMVC\CoreMVCScaffolding\src\CoreMVCScaffolding" controller --force --controllerName ContactsController --model CoreMVCScaffolding.Models.Contacts --dataContext CoreMVCScaffolding.Models.PhoneBookContext --relativeFolderPath Controllers --controllerNamespace CoreMVCScaffolding.Controllers –useDefaultLayout

همانطور که مشخص است، کنترلر و View از روی model ساخته شد. در داخل برنامه در بخش  Error List یک اخطار در مورد انتقال اطلاعات حساس از طریق DbContext، نمایش داده می شود

این بخش در DbContext است که باعث ایجاد اخطار بالا شده است.

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    #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=DESKTOP-5B67SHH;Database=PhoneBook;Trusted_Connection=True;");
}

این بخش را کامنت کنید و در داخل کلاس startup یک سرویس بسازید که اطلاعات connectionstring برای دسترسی به DbContext را نگه داری کند.

//This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddMvc();

    var connection = @"Server=DESKTOP-5B67SHH;Database=PhoneBook;Trusted_Connection=True;";
    services.AddDbContext<PhoneBookContext>(options => options.UseSqlServer(connection));
}

اگر بخواهیم پروژه را اجرا کنیم، برنامه ارور می دهد و اجرا نمی شود، توضیحات ارور در پایین آمده است.

InvalidOperationException: No database provider has been configured for this DbContext.
A provider can be configured by overriding the DbContext.OnConfiguring method or 
by using AddDbContext on the application service provider. 
If AddDbContext is used, then also ensure that your DbContext 
type accepts a DbContextOptions<TContext> object in its constructor 
and passes it to the base constructor for DbContext.

این خطا بیان می کند که هیچ تامین کننده دیتابیسی برای این DbContext تنظیم نشده است. توجه کنید که ما از AddDbContext در داخل متد ConfigureServices(IServiceCollection services) استفاده کرده ایم.

services.AddDbContext<PhoneBookContext>(options => options.UseSqlServer(connection));

اما آن را به DbContext نفرستادیم، ما نیاز داریم که از سازنده زیر برای ارسال به سازنده اصلی DbContext استفاده کنیم.

public PhoneBookContext(DbContextOptions<PhoneBookContext> options) :
    base(options)
{
}

حالا ما می توانیم به کمک دکمه های Ctrl+f5 برنامه را اجرا کنیم یا که به کمک دستور زیر برنامه را اجرا کنیم.

Command

dotnet run

مرورگر را باز کرده و آدرس http://localhost:5000 را وارد کنید. برنامه در حال اجرا را خواهید دید.

عکسهای خروجی


آموزش asp.net mvc

فایل های ضمیمه

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید