معرفی
Code First به ما امکان می دهد مدل خود را با استفاده از کلاس های زبان کد (C#، VB.Net، F# و غیره) نمایش دهیم. همچنین، تنظیمات اضافی را می توان با استفاده از Fluent API یا با اعمال ویژگی ها در کلاس های ما اعمال کرد. ما می توانیم پایگاه داده موجود خود را با مدل Code First منتقل کنیم. این مقاله نحوه انجام مهاجرت Code First را با پایگاه داده موجود توضیح می دهد.
پیش نیازها
- Visual Studio 2012 یا Visual Studio 2013
- Entity Framework نسخه 6.1 یا بالاتر
- Entity Framework Tools برای ویژوال استودیو
- دانش اولیه Code First migration
دستور Reverse Engineer Code First (ابزار Entity Framework) برای تولید کلاس های POCO، نقشه برداری (پیکربندی) و کلاس DbContext بر اساس پایگاه داده موجود استفاده می شود. ابزار Entity Framework می تواند به ما کمک کند تا کلاس POCO را از یک پایگاه داده موجود تولید کنیم. این ابزار فقط کدی را تولید می کند که ما نیز به صورت دستی توسط خودمان می نویسیم.
مثال
فرض کنید من یک پایگاه داده موجود با جدول های کارمند، آدرس کارمند، جزئیات کارمند و آدرس ها دارم. اکنون می خواهم با استفاده از مدل Code First برای پایگاه داده یک اپلیکیشن ایجاد کنم.
![تصویر سیستم](https://www.c-sharpcorner.com/UploadFile/ff2f08/entity-framework-code-first-migrations-with-the-existing-da/Images/system image.jpg)
روش زیر برای ایجاد یک مدل Code First در پایگاه داده موجود است.
مرحله 1: با استفاده از Entity Data Model Wizard یک مدل ایجاد کنید.
![مدل داده خالی](https://www.c-sharpcorner.com/UploadFile/ff2f08/entity-framework-code-first-migrations-with-the-existing-da/Images/empty data model.jpg)
مرحله ۲: گزینه “Code First from Database” را انتخاب کرده و روی “Next” کلیک کنید.
![کد ابتدا از پایگاه داده](https://www.c-sharpcorner.com/UploadFile/ff2f08/entity-framework-code-first-migrations-with-the-existing-da/Images/code first from database.jpg)
مرحله 3: با پایگاه داده ارتباط برقرار کرده و روی "بعدی" کلیک کنید.
![ارتباط دیتا](https://www.c-sharpcorner.com/UploadFile/ff2f08/entity-framework-code-first-migrations-with-the-existing-da/Images/data connection.jpg)
مرحله 4: موردی که باید به مدل اضافه شود را انتخاب کنید و روی دکمه "پایان" کلیک کنید.
![جدول را انتخاب کنید](https://www.c-sharpcorner.com/UploadFile/ff2f08/entity-framework-code-first-migrations-with-the-existing-da/Images/select table.jpg)
کلاس DbContext و کلاس های دامنه به پروژه اضافه شده است. کلاس Context DbSet<TEntity> را برای هر نوع مدل وارد شده نشان می دهد و همچنین سازنده پیش فرضی دارد که سازنده کلاس پایه را با نحو "name=connection string name" فراخوانی می کند. نحو "name=" حاوی نام رشته اتصال است که در گره ConnectionString فایل پیکربندی ذخیره می شود. اگر رشته اتصال در فایل پیکربندی وجود نداشته باشد، Entity Framework خطا می دهد.
![کلاس dbcontext](https://www.c-sharpcorner.com/UploadFile/ff2f08/entity-framework-code-first-migrations-with-the-existing-da/Images/dbcontext class.jpg)
تعریف DbContext (Model.cs)
- namespace CodeFirstonExsitingDB.Models
- {
- using System;
- using System.Data.Entity;
- using System.ComponentModel.DataAnnotations.Schema;
- using System.Linq;
- public partial class Model : DbContext
- {
- public Model()
- : base("name=EntityModel")
- {
- }
- public virtual DbSet<Address> Addresses { get; set; }
- public virtual DbSet<Employee> Employees { get; set; }
- public virtual DbSet<EmployeeDetail> EmployeeDetails { get; set; }
- protected override void OnModelCreating(DbModelBuilder modelBuilder)
- {
- modelBuilder.Entity<Address>()
- .Property(e => e.AddressLine1).IsUnicode(false);
- modelBuilder.Entity<Address>()
- .Property(e => e.AddressLine2).IsUnicode(false);
- modelBuilder.Entity<Address>()
- .Property(e => e.AddressLine3).IsUnicode(false);
- modelBuilder.Entity<Address>()
- .Property(e => e.City).IsUnicode(false);
- modelBuilder.Entity<Address>()
- .Property(e => e.State).IsUnicode(false);
- modelBuilder.Entity<Address>()
- .Property(e => e.Pincode).IsUnicode(false);
- modelBuilder.Entity<Employee>()
- .Property(e => e.Code).IsUnicode(false);
- modelBuilder.Entity<Employee>()
- .Property(e => e.Name).IsUnicode(false);
- modelBuilder.Entity<Employee>()
- .HasOptional(e => e.EmployeeDetail).WithRequired(e => e.Employee);
- modelBuilder.Entity<Employee>()
- .HasMany(e => e.Addresses).WithMany(e => e.Employees).Map(m => m.ToTable("EmployeeAddress").MapLeftKey("EmployeeId").MapRightKey("AddressId"));
- modelBuilder.Entity<EmployeeDetail>()
- .Property(e => e.Email).IsUnicode(false);
- modelBuilder.Entity<EmployeeDetail>()
- .Property(e => e.PhoneNo).IsUnicode(false);
- }
- }
- }
کلاس های دامنه (POCO).
- public partial class Address
- {
- public Address()
- {
- Employees = new HashSet<Employee>();
- }
- public int Id { get; set; }
- [StringLength(50)]
- public string AddressLine1 { get; set; }
- [StringLength(50)]
- public string AddressLine2 { get; set; }
- [StringLength(50)]
- public string AddressLine3 { get; set; }
- [StringLength(20)]
- public string City { get; set; }
- [StringLength(20)]
- public string State { get; set; }
- [StringLength(10)]
- public string Pincode { get; set; }
- public virtual ICollection<Employee> Employees { get; set; }
- }
- [Table("Employee")]
- public partial class Employee
- {
- public Employee()
- {
- Addresses = new HashSet<Address>();
- }
- public int Id { get; set; }
- [StringLength(20)]
- public string Code { get; set; }
- [StringLength(50)]
- public string Name { get; set; }
- public virtual EmployeeDetail EmployeeDetail { get; set; }
- public virtual EmployeeExtendedDetails EmployeeExtendedDetail { get; set; }
- public virtual ICollection<Address> Addresses { get; set; }
- }
- [Table("EmployeeDetail")]
- public partial class EmployeeDetail
- {
- [DatabaseGenerated(DatabaseGeneratedOption.None)]
- public int Id { get; set; }
- [StringLength(255)]
- public string Email { get; set; }
- [StringLength(50)]
- public string PhoneNo { get; set; }
- public virtual Employee Employee { get; set; }
- }
کلاس های دامنه (کلاس های POCO) حاوی یک حاشیه نویسی است که کلاس های ما را با پایگاه داده موجود تراز می کند. در مثال قبل، جدول آدرس دارای ستون AddressLine1 با حداکثر طول 50 در پایگاه داده است، بنابراین این ویژگی با ویژگی StringLength (50) مشخص شده است.
کد تست
اکنون با استفاده از کلاس Dbcontext، میتوانیم مدل را پرس و جو کنیم. در مثال زیر، من تمام کارمندان را از پایگاه داده بازیابی کردم.
- List<Employee> emp = null;
- using (Model context = new Model())
- {
- emp = context.Employees.ToList();
- }