در این پست از وبسایت پرووید در رابطه با روش Database-First در Entity Framework Core #2 صحبت خواهیم کرد. تکنولوژی Entity Framework Core نسل بعدی Entity Framework است که توسط مایکروسافت معرفی شده است.

در قسمت قبلی از این آموزش در رابطه با صحبت کردیم و اما در این قسمت که قسمت دوم از این آموزش هست در رابطه با پارامترهای دستور Scaffold-DbContext صحبت خواهیم کرد.

پارامترهای دستور Scaffold-DbContext

در این دستور مشاهده می‌کنید که اولین پارامتر یک Connection String است که حاوی سه بخش می باشد. Database Server و Database Name و اطلاعات امنیتی. در Connection String مربوطه قسمت Server=.\SQLExpress; به این معنی است که Database Server به صورت Local و بر روی SQLEXPRESS تنظیم شده است. نام دیتابیس SchoolDB است و همچنین اطلاعات امنیتی با مقدار Trusted_Connection=True; تنظیم شده است و این به این معنی است که از Windows Authentication استفاده می شود. به عبارت دیگر از Username و Password ویندوز یا اصطلاحاً Windows Credentials برای متصل شدن به SQL Server استفاده می‌ شود.

آموزش .NET Core برای برنامه نویسان ویندوز

از شما دعوت می کنیم که از بسته ی آموزش .NET Core برای برنامه نویسان ویندوز دیدن کنید.

پارامتر دوم دستور Scaffold-DbContext نام Database Provider است که با مقدار Microsoft.EntityFrameworkCore.SqlServer تنظیم شده است و اما پارامتر بعدی -OutputDir است که با نام فولدری که قصد داریم تمامی کلاس های تولید شده در آن قرار بگیرند تنظیم می‌شود. در این مثال ما فولدر Models از پروژه را برای انجام این کار استفاده کرده‌ایم. و اما اگر جزئیات بیشتری مربوط به دستور Scaffold-DbContext را میخواهید از دستور زیر استفاده کنید.

PM> get-help scaffold-dbcontext –detailed

دستور Scaffold-DbContext که در قسمت بالا مشاهده کردید باعث ساخته شدن Entity Class هایی برای هر کدام از Table های دیتابیس SchoolDB می‌ شود. علاوه بر این کلاس Context با ارث بری کردن از DbContext ساخته می شود.

به منظور انجام پیکر بندی ها در کلاس DbContext از Fluent API استفاده می شود و تمامی Entity Class هایی که در فولدر Models قرار گرفتند پیکربندی می‌شوند. در قسمت پایین Entity Class ای با نام Student که برای جدول Student در دیتابیس ساخته شده است را مشاهده می کنید.

using System;
using System.Collections.Generic;

namespace EFCoreTutorials.Models
{
    public partial class Student
    {
        public Student()
        {
            StudentCourse = new HashSet<StudentCourse>();
        }

        public int StudentId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int? StandardId { get; set; }

        public Standard Standard { get; set; }
        public StudentAddress StudentAddress { get; set; }
        public ICollection<StudentCourse> StudentCourse { get; set; }
    }
}

در قسمت زیر کلاس SchoolDBContext را مشاهده می‌کنید که برای بازیابی کردن و ذخیره کردن داده ها از و بر روی دیتابیس مورد استفاده قرار می گیرد.

using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata;

namespace EFCoreTutorials.Models
{
    public partial class SchoolDBContext : DbContext
    {
        public virtual DbSet<Course> Course { get; set; }
        public virtual DbSet<Standard> Standard { get; set; }
        public virtual DbSet<Student> Student { get; set; }
        public virtual DbSet<StudentAddress> StudentAddress { get; set; }
        public virtual DbSet<StudentCourse> StudentCourse { get; set; }
        public virtual DbSet<Teacher> Teacher { 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=.\SQLExpress;Database=SchoolDB;Trusted_Connection=True;");
            }
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Course>(entity =>
            {
                entity.Property(e => e.CourseName)
                    .HasMaxLength(50)
                    .IsUnicode(false);

                entity.HasOne(d => d.Teacher)
                    .WithMany(p => p.Course)
                    .HasForeignKey(d => d.TeacherId)
                    .OnDelete(DeleteBehavior.Cascade)
                    .HasConstraintName("FK_Course_Teacher");
            });

            modelBuilder.Entity<Standard>(entity =>
            {
                entity.Property(e => e.Description)
                    .HasMaxLength(50)
                    .IsUnicode(false);

                entity.Property(e => e.StandardName)
                    .HasMaxLength(50)
                    .IsUnicode(false);
            });

            modelBuilder.Entity<Student>(entity =>
            {
                entity.Property(e => e.StudentId).HasColumnName("StudentID");

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

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

                entity.HasOne(d => d.Standard)
                    .WithMany(p => p.Student)
                    .HasForeignKey(d => d.StandardId)
                    .OnDelete(DeleteBehavior.Cascade)
                    .HasConstraintName("FK_Student_Standard");
            });

            modelBuilder.Entity<StudentAddress>(entity =>
            {
                entity.HasKey(e => e.StudentId);

                entity.Property(e => e.StudentId)
                    .HasColumnName("StudentID")
                    .ValueGeneratedNever();

                entity.Property(e => e.Address1)
                    .IsRequired()
                    .HasMaxLength(50)
                    .IsUnicode(false);

                entity.Property(e => e.Address2)
                    .HasMaxLength(50)
                    .IsUnicode(false);

                entity.Property(e => e.City)
                    .IsRequired()
                    .HasMaxLength(50)
                    .IsUnicode(false);

                entity.Property(e => e.State)
                    .IsRequired()
                    .HasMaxLength(50)
                    .IsUnicode(false);

                entity.HasOne(d => d.Student)
                    .WithOne(p => p.StudentAddress)
                    .HasForeignKey<StudentAddress>(d => d.StudentId)
                    .HasConstraintName("FK_StudentAddress_Student");
            });

            modelBuilder.Entity<StudentCourse>(entity =>
            {
                entity.HasKey(e => new { e.StudentId, e.CourseId });

                entity.HasOne(d => d.Course)
                    .WithMany(p => p.StudentCourse)
                    .HasForeignKey(d => d.CourseId)
                    .OnDelete(DeleteBehavior.ClientSetNull)
                    .HasConstraintName("FK_StudentCourse_Course");

                entity.HasOne(d => d.Student)
                    .WithMany(p => p.StudentCourse)
                    .HasForeignKey(d => d.StudentId)
                    .HasConstraintName("FK_StudentCourse_Student");
            });

            modelBuilder.Entity<Teacher>(entity =>
            {
                entity.Property(e => e.StandardId).HasDefaultValueSql("((0))");

                entity.Property(e => e.TeacherName)
                    .HasMaxLength(50)
                    .IsUnicode(false);

                entity.HasOne(d => d.Standard)
                    .WithMany(p => p.Teacher)
                    .HasForeignKey(d => d.StandardId)
                    .OnDelete(DeleteBehavior.Cascade)
                    .HasConstraintName("FK_Teacher_Standard");
            });
        }
    }
}

نکته بسیار مهم اینکه Entity Framework Core فقط بر اساس Table های موجود در دیتابیس Entity Class ها را و نه برای Stored Procedure یا View ها. به عبارت دیگر برای هر Table از بانک اطلاعاتی یک Entity Class ساخته می شود.

بسته ی آموزش شروع به کار با Entity Framework Core

از شما دعوت می کنیم که از بسته ی آموزش شروع به کار با Entity Framework Core دیدن کنید.

انجام دستور Scaffold-DbContext با استفاده از DotNet CLI

اگر از DotNet CLI که مخفف Command Line Interface می باشد به منظور اجرا کردن دستورات Entity Framework Core استفاده می ‌کنید می ‌توانید Command Prompt را باز کنید و با Navigate کردن به فولدر root و اجرا کردن دستور زیر از دیتابیس یک Model بسازید.

بسته ی آموزش ساخت برنامه های Cross-Platform با .NET Core

از شما دعوت می کنیم که از بسته ی آموزش ساخت برنامه های Cross-Platform با .NET Core دیدن کنید.

نکته بسیار مهم اینکه پس از ساختن Model با استفاده از این روش می توانید با استفاده از دستورات مربوط به Migration تغییراتی که بر روی Model ایجاد می کنید را بر روی دیتابیس اعمال کرده و هر دوی اینها را با همدیگر Sync کنید.

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

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