EF Core ORM Haqida

Entity Framework (EF) Core — Entity Framework data access technology (Entity Framework ma’lumotlar bazasiga ulanish texnologiyas) ning yengil, kengaytirilgan, ochiq kodli va bir nechta platformada ishlaydigan versiyasi.
EF Core ORM (object-relational mapper) sifatida:
.NET dasturchilariga .NET obyektlari orqali databaza bilan ishlashga imkon beradi
Odatda kerak bo‘ladigan ko‘p data-access kodlarni yozish ehtiyojini bartaraf etadi
EF Core ko'p databaza engine larni qo'llab quvvatlaydi, Ko'proq ma'lumotni Database Providers da o'qing.
Mundarija:
Model
Querying
Saving data
EF ORM ning muhim omillari
EF Core bilan boshlash
Xulosa
Model
EF Core da, ma'lumotlarga ruxsat olish model yordamida bajariladi. Model esa entity class lari va ma’lumotlar bazasi bilan bog‘langan sessiya kontekst obyektlari asosida yaratiladi. Kontekst obyektlari querying va saving data ga ruxsat beradi. Ko'proq ma'lumotlarni Creating a Model da oling.
EF quyidagi model yaratish usullarini qo'llab quvvatlaydi:
Mavjud databazadan model generatsiya qilish.
Modelni databazaga moslagan holda qo'lda yozish.
Model yaratganingizdan so'ng, EF Migrations dan foydalanib, modeldan databaza yarating. Migratsiyalar model o‘zgarganda ma’lumotlar bazasini rivojlantirishga imkon beradi.
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore;
namespace Intro;
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(
@"Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;ConnectRetryCount=0");
}
}
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
public int Rating { get; set; }
public List<Post> Posts { get; set; }
}
public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public int BlogId { get; set; }
public Blog Blog { get; set; }
}Querying
Sizning entity class laringizdagi obyektlar ma’lumotlar bazasidan Language Integrated Query (LINQ) yordamida olinadi. Qo‘shimcha ma’lumot uchun Querying Data bo‘limiga qarang.
using (var db = new BloggingContext())
{
var blogs = await db.Blogs
.Where(b => b.Rating > 3)
.OrderBy(b => b.Url)
.ToListAsync();
}Saving data
Ma’lumotlar bazasida ma’lumotlar sizning entity class laringizdagi obyektlar yordamida yaratiladi, o‘chiriladi va o‘zgartiriladi. Batafsil ma’lumot uchun Saving Data bo‘limiga qarang.
using (var db = new BloggingContext())
{
var blog = new Blog { Url = "http://sample.com" };
db.Blogs.Add(blog);
await db.SaveChangesAsync();
}EF ORM ning muhim omillari
EF Core ko‘p dasturlash tafsilotlarini soddalashtirsada, har qanday ORM ga tegishli ba’zi eng yaxshi amaliyotlar mavjud bo‘lib, ular ishlab chiqarishdagi ilovalarda keng tarqalgan xatolardan saqlaydi:
Ma’lumotlar bazasi bo‘yicha o‘rta yoki yuqori darajadagi bilimlar zarur: yuqori unumdorlikdagi ishlab chiqarish ilovalarini loyihalash, nosozliklarni tuzatish, profiling qilish va ma’lumotlarni migratsiya qilish uchun. Masalan: primary va foreign key lar, constraint lar, index lar, normalizatsiya, DML va DDL buyruqlari, ma’lumot turlari, profiling va hokazo.
Funksional va integratsion testlar: Ishlab chiqarish muhiti imkon qadar yaqin tarzda takrorlanishi kerak, shunda:
Maxsus versiya yoki edition da ishlaganda yuzaga chiqadigan xatolarni aniqlash mumkin.
EF Core va boshqa bog‘liqliklar (dependency) ni yangilashda buzilishlarni ushlash mumkin. Masalan, ASP.NET Core, OData yoki AutoMapper kabi framework larni qo‘shish yoki yangilash EF Core ga kutilmagan ta’sir ko‘rsatishi mumkin.
Unumdorlik va stress testlari: Representativ yuk bilan test qilish muhim. Ba’zi funksiyalarning sodda ishlatilishi kengaymaydi. Masalan:
Bir nechta collection Includes ishlatish
Lazy loading dan haddan tashqari foydalanish
Index bo‘lmagan ustunlarda shartli so‘rovlar
Store-generated qiymatlar bilan katta update va insert lar
Concurrency handling yo‘qligi
Katta model va yetarli cache siyosatining bo‘lmasligi
Xavfsizlik tekshiruvi: Masalan, connection string va boshqa sirlarni boshqarish, deployment bo‘lmagan foydalanuvchilar uchun ruxsatlar, raw SQL uchun input validation, sezgir ma’lumotlarni shifrlash. Batafsil: Secure authentication flows.
Logging va diagnostika yetarliligi: Masalan, mos logging konfiguratsiyasi, query tag lar va Application Insight lar.
Xato tiklash: Quyidagi umumiy xato holatlari uchun reja tuzing: versiya rollback, fallback server lar, scale-out va load balancing, DoS oldini olish, va ma’lumotlarni backup qilish.
Ilovani deployment va migratsiya qilish: Deployment vaqtida migratsiyalar qanday tatbiq qilinishini rejalashtiring; ilova boshlanishida bajarish concurrency muammolarini keltirib chiqarishi mumkin va normal ishlash uchun ortiqcha ruxsat talab qiladi. Fatal xatolar yuz berganda tiklanish uchun staging dan foydalaning. Batafsil: Applying Migrations.
Generatsiya qilingan migratsiyalarni batafsil tekshirish va testlash: Migratsiyalar ishlab chiqarish ma’lumotlariga tatbiq qilinishdan oldin sinovdan o‘tishi kerak. Jadvaldagi ustunlar va kolonkalarni bir marta yaratgach oson o‘zgartirish mumkin emas. Masalan, SQL Server da nvarchar(max) va decimal(18,2) ko‘pincha string va decimal property lar uchun eng yaxshi tur emas, lekin EF ning default qiymatlari bo‘lib, u sizning maxsus holatingizni bilmaydi.
EF Core bilan boshlash
Boshlash uchun uchta NuGet paketini qo‘shishimiz kerak:
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Tools
Tools paketi bizga loyihani tuzishda va ma’lumotlar bazasini o‘zgartirishda yordam beradigan buyruqlarni bajarish imkonini beradi. Ushbu videoda ishlatadigan ba’zi buyruqlar: dbcontext scaffold, migration add, va database update.
Bu buyruqlar yordamida People jadvalini qo‘shuvchi migratsiyani yaratib, bajarish mumkin bo‘ladi va u Person class orqali foydalaniladi.
Entity Framework Core da barcha ma’lumotlarga kirish DbContext dan meros olgan class orqali amalga oshiriladi.
Bizning loyihada bu AcmeDataContext bo‘lib, u DbSet<Person> tipidagi People property sini taqdim etadi.
Entity Framework Core ushbu C# classni konventsiyalar orqali People jadvaliga bog‘laydi.
Kontekst yaratilganidan so‘ng, biz query, insert va delete kabi ma’lumotlar bazasi buyruqlarini bajarishimiz mumkin.
Entity Framework Core ning ba’zi trade-off lari mavjud:
Boshqa an’anaviy yondashuvlarga (masalan, ADO.NET) qaraganda ishlash samarasi pasayishi va xotira ishlatilishi oshishi mumkin.
Lekin ko‘pchilik dasturchilar bu trade-off lardan voz kechib, dasturchi unumdorligini oshirish, yuqori darajadagi ma’lumotlar bazasi abstraksiyasi va unit test imkoniyatlari uchun EF Core dan foydalanishni ma’qul ko‘radi.
Kod va Buyruqlar
Bu buyruqlarni command line terminal dan bajarish kerak, masalan, Rider dagi terminal.
Scaffolding
dotnet ef dbcontext scaffold [connection string] [data provider] [dbcontext name]
Migratsiya qo‘shish (Add Migration)
dotnet ef migration add [migration name]
Database yangilash (Update Database)
dotnet ef database update
Program.cs misoli
class Program
{
static void Main(string[] args)
{
var db = new AcmeDataContext();
db.People.Add(new Person {Name = "Khalid"});
db.SaveChanges();
// dastlabki son
Console.WriteLine($"# of people in the db: {db.People.Count()}");
var first = db.People.First();
Console.WriteLine($"first person: {first.Name}");
var startsWith = db
.People
.First(p => p.Name.StartsWith("kh"));
Console.WriteLine($"starts with kh: {startsWith.Name}");
// shaxsni o‘chirish mumkin
db.People.Remove(first);
db.SaveChanges();
// oxirgi son
Console.WriteLine($"# of people in the db: {db.People.Count()}");
}
}
Project CSPROJ
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.4">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
</ItemGroup>
</Project>
AcmeDataContext
using System;
using System.Diagnostics;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata;
namespace BasicsOfEntityFrameworkCore
{
[DebuggerDisplay("{Name}")]
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
}
public partial class AcmeDataContext : DbContext
{
public DbSet<Person> People { get; set; }
public AcmeDataContext() { }
public AcmeDataContext(DbContextOptions<AcmeDataContext> options)
: base(options) { }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
#warning Maxfiy ma’lumotlarni kod ichida saqlash tavsiya etilmaydi. Connection string ni alohida faylga o‘tkazing.
optionsBuilder.UseSqlServer("<Connection String>");
}
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
OnModelCreatingPartial(modelBuilder);
}
partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}
}
Ma'lumotlar Microsoft Docs va JetBrains saytlaridan olindi.
Terminlar:
ORM — bu ma’lumotlar bazasi va dasturdagi obyektlar o‘rtasidagi ko‘prik
Database engine — bu ma’lumotlar bazasini boshqaradigan asosiy qism
Querying (so'rov yuborish) — bu ma’lumotlar bazasidan kerakli ma’lumotlarni olish jarayoni
Saving data (ma'lumot saqlash) — bu ma’lumotlarni ma’lumotlar bazasiga yozish, yangilash yoki o‘chirish jarayoni
Entity class — bu ma’lumotlar bazasidagi jadvalga mos keladigan C# class
Terminlar o'zbekcha tarjimada yozilmaydi va aytilmaydi. Shuning uchun Artiklda tarjimasiz yozilgan va artikl oxirida ma'nosi bilan yozib qo'ydik.
Rasmiy veb-sahifa: EF Core
by LeGee