آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

آموزش ساخت مدل برای یک دیتابیس در Entity Framework Core

دوره های مرتبط با این مقاله

آموزش ساخت مدل برای یک دیتابیس در Entity Framework Core

در این بخش یاد می گیرید چگونه context و entity class ها را برای یک دیتابیس موجود بسازید. ساخت کلاس های entity & context برای دیتابیس موجود رویکرد Database-First است.

EF Core ابزاری بصری برای DB model مشابه EF6 ندارد. باید با دستور Scaffold-DbContext، reverse engineering انجام دهیم. این دستور کلاس های لازم را بر اساس شمای دیتابیس موجود می سازد.

دیتابیس SchoolDB database را در نظر بگیرید. می خواهیم برای آن کلاس های entity & context را بسازیم.


ساخت مدل برای یک دیتابیس در Entity Framework Core

دستور Scaffold-DbContext برای ساخت model براساس دیتابیس موجود به کار می رود. پارامترهای زیر را می توان با این دستور در PMC تعیین کرد:


						Scaffold-DbContext [-Connection] [-Provider] [-OutputDir] [-Context] [-Schemas>] [-Tables>] 
						[-DataAnnotations] [-Force] [-Project] [-StartupProject] [< CommonParameters >]

در Visual Studio، از مسیر Tools -> NuGet Package Manger -> Package Manger Console ، PMC را باز کنید و دستور زیر را اجرا کنید:


PM> Scaffold-DbContext "Server=.\SQLExpress;Database=SchoolDB;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models

در دستور بالا، اولین پارامتر یک connection string است که سه قسمت دارد: DB Server، database name و security info.

در اینجا Server=.\SQLExpress; نام local SQLEXPRESS database server است. Database=SchoolDB; نام دیتابیس را تعیین می کند. Trusted_Connection=True; مشخص می کند از Windows authentication استفاده می کنیم. یعنی از نام User و رمز عبور ویندوز برای اتصال به سرور استفاده می شود. پارامتر دوم نام provider است که برای SQL Server، Microsoft.EntityFrameworkCore.SqlServer تعیین شده. پارامتر -OutputDir مسیر ساخته شدن کلاس ها را مشخص می کند که پوشه Models است.

از دستور زیر برای دیدن جزئیات Scaffold-DbContext استفاده کنید:


PM> get-help scaffold-dbcontext –detailed

دستور Scaffold-DbContext بالا کلاس های entity را برای هر جدول درون دیتابیس می سازد و context class را نیز با ارث بری از DbContext با Fluent API configurations برای همه entity ها می سازد و درون پوشه Models قابل مشاهده است.


ساخت مدل برای یک دیتابیس در Entity Framework Core

کد زیر برای جدول 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");
            });
        }
    }
}

نکته: EF Core فقط به ازای جدول ها entity class می سازد. برای StoredProcedure ها و View ها کلاسی ساخته نمی شود.

DotNet CLI

اگر از dotnet CLI برای اجرای دستورات EF Core استفاده می کنید، CMD را باز کنید و به root folder پروژه بروید. دستور dotnet ef dbcontext scaffold را اجرا کنید:


> dotnet ef dbcontext scaffold "Server=.\SQLEXPRESS;Database=SchoolDB;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -o Models

به این صورت می توانید برای دیتابیس موجود EF Core model بسازید.

نکته: پس از ساخت مدل، باید با دستورات Migration برای update کردن دیتابیس با مدل استفاده کنید.

  • 43
  •    0
  • تاریخ ارسال :   1398/06/13

دانشجویان گرامی اگر این مطلب برای شما مفید بود لطفا ما را در GooglePlus محبوب کنید
رمز عبور: tahlildadeh.com یا www.tahlildadeh.com
ارسال دیدگاه نظرات کاربران
شماره موبایل دیدگاه
عنوان پست الکترونیک

ارسال

آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

تمامی حقوق این سایت متعلق به آموزشگاه تحلیل داده می باشد .