پیاده سازی
هنگام شروع یک پروژه جدید، گاهی اوقات ممکن است یک پایگاه داده وجود داشته باشد و اگر بتوانیم مدل های کد اول را از پایگاه داده موجود تولید کنیم، تلاش ما را کاهش می دهد. حال، بیایید ببینیم که چگونه میتوان مدلهای Entity Framework Core Code-First را از پایگاه داده در ASP.NET Core تولید کرد.
ابتدا Visual Studio را باز کنید (من از VS2017 Community edition استفاده می کنم) و یک پروژه ASP.NET Core جدید ایجاد کنید.
![اولین مدلهای کد هسته چارچوب موجودیت را از پایگاه داده در هسته ASP.NET ایجاد کنید](http://pezhvak24.ir/dl/10kcor/cscd/article/generate-entity-framework-core-code-first-models-from-database-in-asp-net-core/Images/Generate Entity Framework Core Code First Models From Database In ASP.NET Core.jpg)
و سپس، برای اهداف آزمایشی، یک جدول نمونه به نام "کارمند" در پایگاه داده خود ایجاد کرده ام. در زیر فیلمنامه آمده است.
- USE [Demo]
- GO
- CREATE TABLE [dbo].[EMPLOYEE](
- [Id] [int] NOT NULL IDENTITY PRIMARY KEY,
- [Name] [varchar](100) NOT NULL,
- [Designation] [varchar](100) NOT NULL,
- [SALARY] [int] NULL,
- [Branch] [varchar](100) NULL
- )
- GO
اکنون مانند تصویر زیر به Tools-> NuGet Package Manager -> Package Manager Console بروید.
![اولین مدلهای کد هسته چارچوب موجودیت را از پایگاه داده در هسته ASP.NET ایجاد کنید](http://pezhvak24.ir/dl/10kcor/cscd/article/generate-entity-framework-core-code-first-models-from-database-in-asp-net-core/Images/Generate Entity Framework Core Code First Models From Database In ASP.NET Core1.png)
اکنون برای تولید مدلهای کد اول EF Core از پایگاه داده در ASP.NET Core، از دستور Scaffold-DbContext استفاده میشود. در زیر سینتکس اجرای دستور Scaffold-DbContext آمده است.
PM > Scaffold-DbContext ConnectionString Provider -OutputDir DirectoryName
در زیر فرمان نمونه ای است که من برای تولید مدل ها از پایگاه داده استفاده کرده ام.
PM> Scaffold-DbContext "Server=xxx;Database=Demo;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
کلاس های مدل و فایل DbContext را تولید می کند. در زیر محتوای فایل Employee.cs و DemoContext.cs ایجاد شده است.
Employee.cs
- using System;
- using System.Collections.Generic;
- namespace AspNetCore2Application.Models
- {
- public partial class Employee
- {
- public int Id { get; set; }
- public string Name { get; set; }
- public string Designation { get; set; }
- public int? Salary { get; set; }
- public string Branch { get; set; }
- }
- }
DemoContext.cs
- using System;
- using Microsoft.EntityFrameworkCore;
- using Microsoft.EntityFrameworkCore.Metadata;
- namespace AspNetCore2Application.Models
- {
- public partial class DemoContext : DbContext
- {
- public DemoContext()
- {
- }
- public DemoContext(DbContextOptions<DemoContext> options)
- : base(options)
- {
- }
- public virtual DbSet<Employee> Employee { 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=xxx;Database=Demo;Trusted_Connection=True;");
- }
- }
- protected override void OnModelCreating(ModelBuilder modelBuilder)
- {
- modelBuilder.Entity<Employee>(entity =>
- {
- entity.ToTable("EMPLOYEE");
- entity.Property(e => e.Id).ValueGeneratedNever();
- entity.Property(e => e.Branch)
- .HasMaxLength(100)
- .IsUnicode(false);
- entity.Property(e => e.Designation)
- .IsRequired()
- .HasMaxLength(100)
- .IsUnicode(false);
- entity.Property(e => e.Name)
- .IsRequired()
- .HasMaxLength(100)
- .IsUnicode(false);
- entity.Property(e => e.Salary).HasColumnName("SALARY");
- });
- }
- }
- }
استفاده از نام پایگاه داده
اکنون، اگر به Employee.cs نگاه کنید، نام جدول و نام ستون مطابقت ندارند. نام جدول من EMPLOYEE است اما نام کلاس Employee است. این به این دلیل است که، به طور پیش فرض، نام پایگاه داده به شیوه نام C# تغییر یافته است. اگر می خواهید نام پایگاه داده را حفظ کنید، باید یک پارامتر اضافی -UseDatabaseNames را در دستور خود پاس کنید. اکنون دستور اصلاح شده به شکل زیر است.
Scaffold-DbContext "Server=xxx;Database=Library;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -UseDatabaseNames
حالا اگه دستور بالا رو اجرا کنم ارور زیر رو میده.
فایل(های) زیر از قبل در دایرکتوری C:\Users\xxxx\Documents\Visual Studio 2017\Projects\Asp.NetCore2.0Application\Asp.NetCore2.0Application\Models وجود دارد: DemoContext.cs,Employee.cs. از پرچم Force برای بازنویسی این فایل ها استفاده کنید .
بنابراین، ما باید فایل های موجود را نادیده بگیریم. برای آن، باید پارامتر -Force را به دستور منتقل کنیم. اکنون دستور اصلاح شده ما مانند زیر خواهد بود.
Scaffold-DbContext "Server=xxx;Database=Library;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -UseDatabaseNames -Force
اگر این دستور را اجرا کنید، کلاس زیر را با نام ها، مانند جدول پایگاه داده دریافت خواهید کرد.
- using System;
- using System.Collections.Generic;
- namespace AspNetCore2Application.Models
- {
- public partial class EMPLOYEE
- {
- public int Id { get; set; }
- public string Name { get; set; }
- public string Designation { get; set; }
- public int? SALARY { get; set; }
- public string Branch { get; set; }
- }
- }
استفاده از حاشیه نویسی داده ها
پس از آن، بیایید به DemoContext.cs نگاه کنیم. تمام مدل ها با استفاده از FluentAPI پیکربندی شده اند. این گزینه ی پیش فرض می باشد. اما اگر میخواهید از ویژگیهای DataAnnotation برای پیکربندی مدلها استفاده کنید، باید پارامتر -DataAnnotations را در دستوری مانند زیر ارسال کنیم.
PM> Scaffold-DbContext "Server=xxx;Database=Demo;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -UseDatabaseNames -force -DataAnnotations
اکنون، می توانید محتویات فایل Employee.cs و DemoContext.cs اصلاح شده را مشاهده کنید.
Employee.cs
- using System;
- using System.Collections.Generic;
- using System.ComponentModel.DataAnnotations;
- using System.ComponentModel.DataAnnotations.Schema;
- namespace AspNetCore2Application.Models
- {
- public partial class EMPLOYEE
- {
- public int Id { get; set; }
- [Required]
- [StringLength(100)]
- public string Name { get; set; }
- [Required]
- [StringLength(100)]
- public string Designation { get; set; }
- public int? SALARY { get; set; }
- [StringLength(100)]
- public string Branch { get; set; }
- }
- }
DemoContext.cs
- using System;
- using Microsoft.EntityFrameworkCore;
- using Microsoft.EntityFrameworkCore.Metadata;
- namespace AspNetCore2Application.Models
- {
- public partial class DemoContext : DbContext
- {
- public DemoContext()
- {
- }
- public DemoContext(DbContextOptions<DemoContext> options)
- : base(options)
- {
- }
- public virtual DbSet<EMPLOYEE> EMPLOYEE { 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=xxx;Database=Demo;Trusted_Connection=True;");
- }
- }
- protected override void OnModelCreating(ModelBuilder modelBuilder)
- {
- modelBuilder.Entity<EMPLOYEE>(entity =>
- {
- entity.Property(e => e.Id).ValueGeneratedNever();
- entity.Property(e => e.Branch).IsUnicode(false);
- entity.Property(e => e.Designation).IsUnicode(false);
- entity.Property(e => e.Name).IsUnicode(false);
- });
- }
- }
- }
نتیجه
امیدوارم نحوه تولید مدل های کد اول EF Core را از پایگاه داده در ASP.NET Core یاد گرفته باشید. آیا این آموزش را دوست دارید؟ با ارسال نظرات و بازخورد خود در زیر به من کمک کنید تا پیشرفت کنم.