Persons { get; set; }
}
}
Endi AdventureWorks2012 DBdagi Person.Person jadvaliga mos Persons ob’ekti bilan ishlash mumkin. Barcha xodimlar ro‘yxatini aniqlash (namuna):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GetPerson
{
class Program
{
static void Main(string[] args)
{
using (PersonContext db = new PersonContext())
{
foreach (Person u in db.Persons)
Console.WriteLine("{0}. {1} {2}", u.BusinessEntityID, u.LastName, u.FirstName);
}
Console.ReadKey();
}
}
}
Code First va EF Power Tools
Yuqori keltirilgan texnologiya bilan bir qatorda Microsoft kompaniyasi bizga ushbu jarayonlarni avtomatlashtirish imkonini beradigan instrumentni taklif qiladi. Ushbu instrument EF Power Tools deb nomlanadi.
EF Power Tools orqali Visual Studio ga mos sozlash amalga oshiriladi. Ushbu sozlashni Entity Framework Power Tools dan o‘qib olishingiz mumkin. Entity Framework Power Tools faqatgina Visual Studio ning to‘liq versiyalarida ishlaydi.
Agar sizda Visual Studio ning to‘liq versiyasi o‘rnatilgan bo‘lsa, Solution Explorer (Obozrevatel resheniy) oynasida loyiha nomiga sichqonchani o‘ng tugmasi bosilganda, kontekstli menyuda Entity Framework qismi hosil bo‘lishi lozim:
Ushbu menyudan Entity Framework –> Reverse Engineer Code First ni tanlaymiz. Natijada bizda DBga ulanish muloqot oynasi taqdim etiladi:
Avvalgi bo‘limda keltirilgan DBni tanlash lozim. Shundan so‘ng loyihada Models papkasi hosil qilinadi. Ushbu papkada barcha hosil qilingan klasslar mavjud. DBdagi har bir jadvalga mos klasslar va ularga mos ma’lumotlar konteksti klassi ushbu papkada joylashgan:
Bizning DBda faqat bitta Users jadvali mavjud bo‘lganligi sababli, avtomatik tarzda User klassi generatsiya qilingan bo‘lib, u jadval tuzilmasini ifodalaydi:
using System;
using System.Collections.Generic;
namespace EFPowerTools.Models
{
public partial class User
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
}
Ma’lumotlar konteksti klassi userstoredbContext esa quyidagi mazmunga ega:
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using EFPowerTools.Models.Mapping;
namespace EFPowerTools.Models
{
public partial class userstoredbContext : DbContext
{
static userstoredbContext()
{
Database.SetInitializer(null);
}
public userstoredbContext()
: base("Name=userstoredbContext")
{
}
public DbSet Users { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new UserMap());
}
}
}
Ushbu klassda ikkita konstruktor mavjud. Statik konstuktor orqali ma’lumotlarni boshlang‘ich initsializatsiya qilish amalga oshiriladi. Bizning holda u hech qanday amal bajarmaydi. Standart konstruktor orqali bosh klassga (DbContext) murojaat qilinib, unga DB bilan ulanish satri base("Name=userstoredbContext") parametr sifatida uzatiladi.
Users jadvali bilan ishlash uchun ma’lumotlar kontekstida public DbSet Users { get; set; } xususiyati e’lon qilingan.
OnModelCreating metodida model hosil qilish uchun amallar bajariladi. Bizning holda UserMap klassi yordamida klasslar va DB o‘rtasida aloqa shakllantiriladi.
UserMap klassi jadval ustunlari va klass xususiyatlari o‘rtasida moslikni amalga oshiradi:
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity.ModelConfiguration;
namespace EFPowerTools.Models.Mapping
{
public class UserMap : EntityTypeConfiguration
{
public UserMap()
{
// Primary Key
this.HasKey(t => t.Id);
// Properties
this.Property(t => t.Name)
.IsRequired()
.HasMaxLength(50);
// Table & Column Mappings
this.ToTable("Users");
this.Property(t => t.Id).HasColumnName("Id");
this.Property(t => t.Name).HasColumnName("Name");
this.Property(t => t.Age).HasColumnName("Age");
}
}
}
Dasturdagi boshqa amallarni Code First yondashuviga o‘xshash tarzda amalga oshirish mumkin. Biz jadvalga yangi User ob’ektini qo‘shib qo‘ymoqchi bo‘lsak, quyidagi koddan foydalanamiz:
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using EFPowerTools.Models.Mapping;
namespace EFPowerTools.Models
{
public partial class userstoredbContext : DbContext
{
static userstoredbContext()
{
Database.SetInitializer(null);
}
public userstoredbContext()
: base("Name=userstoredbContext")
{
}
public DbSet Users { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new UserMap());
}
}
}
Real hayotda DB murakkab tuzilmaga ega bo‘ladi. Shuning uchun generatsiya qilinayotgan klasslar User klassidan murakkab bo‘ladi. Ammo, ushbu misolda DBdagi ba’zi jadvallarga mos klasslarni avtomatik hosil qilishimiz mumkin.
Database First
Database First yondashuvi Entity Framework birinchi bor yaratilgan vaqtda taqdim qilingan edi. Ushbu yondashuv ko‘p jihatdan Model First ga o‘xshash bo‘lib, DB tayyor bo‘lgan holda ishlatiladi.
Entity Framework muayyan DBdagi ma’lumotlar bilan ishlashi uchun tizimda mos provayder o‘rnatilgan bo‘lishi lozim. Visual Studio da MS SQL Server ob’ektlari bilan ishlash uchun barcha zaruriy infratuzilmalar o‘rnatilgan. MySQL, Oracle va boshqa turdagi DBlar uchun mos provayderlarni o‘rnatish lozim. Eng keng tarqalgan DB provayderlarini ADO.NET Data Providers dan olish mumkin.
YAngi Console Application turidagi loyihani yaratamiz. Uning funksionali avvalgi loyihalarga o‘xshash tarzda amalga oshiriladi. Faqat Entity Framework ga yondashuv boshqacha tarzda tashkil qilinadi. Ushbu yondashuv asosida dastur yaratilayotganda DBda zarur ob’ektlar mavjud bo‘lishi shart.