add elementi orqali connectionStrings seksiyasiga DBga ulanish satri keltiriladi. Bitta loyihada bir qancha add elementlaridan foydalanish mumkin.
name="DefaultConnection" atributi ulanish satri nomini ifodalaydi. Ulanish satri nomi ma’lumotlar kontekstiga mos holda shakllantirilishi lozim. Yuqoridagi misolda bosh klass konstruktoriga base("DefaultConnection") qiymatni parametr qilib uzatdik. Agar konstruktor parametrsiz holda chaqirilsa,
class SoccerContext : DbContext
{
public SoccerContext()
{ }
public DbSet Players { get; set; }
}
Ushbu holda, ulanish satri kontekst nomi bilan ustma-ust tushishi lozim: name="SoccerContext".
Ulanish satridagi keyingi element ulanishning parametrni aniqlaydi. Ushbu element bir qancha qismlardan iborat:
• Data Source: server nomi. MS SQL Express uchun ushbu parametr. \SQLEXPRESS qiymatga teng;
• Initial Catalog: DB katalogi nomi. Bizning misolda bu qiymat Players ga teng, shuning uchun Code First yondashuvchidan foydalanilganda serverda Players.mdf DB si hosil qilinadi;
• Integrated Security: foydalanuvchi parametrlari.
Oxirgi element sifatida provayder o’rnatiladi:
providerName="System.Data.SqlClient"
Natijada, dastur ishlashi jarayonida Players DB hosil qilinadi (agar mavjud bo’lmasa) va ishlatiladi.
Model First va Database First yondashuvlarida ulanish satri
Model First va Database First yondashuvlaridan foydalanilganda ulanish satri biroz boshqacha ko’rinish oladi:
connectionString="metadata=res://*/Person.csdl|res://*/Person.ssdl|res://*/Person.msl;provider=System.Data.SqlClient;
provider connection" string="data source=HP-PC\SQLEXPRESS;
initial catalog=persondb;integrated security=True;
MultipleActiveResultSets=True;App=EntityFramework"" />
Bu yerda ulanish satrida quyidagi parametrlar muhim:
• metadata parametri. Modeldagi metama’lumotlarni o’zida saqlaydi ( ushbu holda model Person kabi nomlanganligi sababli, metama’lumotlar: Person.csdl, Person.ssdl, Person.msl)
• data source parametri. MS SQL serverni moslashtiradi.
• initial catalog parametri. DB katalogini o’rnatadi.
Ushbu holda ma’lumotlar bazasi nomini, uning joylashgan manzilini o’zgartirish yoki boshqa modelni ishlatish uchun yuqorida keltirilgan parametrlarga muayyan o’zgartirishlarni amalga oshirish lozim.
Navigatsion xususiyatlar va lazy loading
Yuqoridagi misolda model sifatida Player klassidan foydalanildi. Ushbu model futbolchini ifodalab, to’rtta xususiyatdan iborat edi. Ammo ushbu model juda sodda hisoblanib, real hayotda bizning DB bir qancha jadvallar mavjud bo’lishi mumkin va ushbu jadvallar o’zaro turli usullarda bog‘langan.
Har bir futbolchini muayyan jamoaga biriktirish lozim bo’lsin. Yoki bitta futbol jamoasida bir qancha futbolchilar mavjud bo’lsin. Ushbu holda yuqoridagi Player va Team ob’ektlari birga ko’p (one-to-many) kabi aloqaga kirishadi.
Bizda Team klassi quyidagicha aniqlangan bo’lsin:
class Team
{
public int Id { get; set; }
public string Name { get; set; } // jamoa nomi
public string Coach { get; set; } // trener
}
Player klassi esa futbolchini tavsiflab, quyidagicha ko’rinishga ega bo’lsin:
class Player
{
public int Id { get; set; }
public string Name { get; set; }
public string Position { get; set; }
public int Age { get; set; }
public int? TeamId { get; set; }
public Team Team { get; set; }
}
Ushbu Player klassida oddiy Name, Position va Age tiplaridan farqli ravishda tashqi kalit aniqlangan. Tashqi kalit oddiy va navigatsion xususiyatlardan iborat.
Player klassidagi public Team Team { get; set; } xususiyati - navigatsion xususiyat deb nomlanadi. Futbolchi haqidagi ma’lumot shakllantirilayotgan vaqtda u DBdan ma’lumotlarni avtomatik oladi.
Tashqi kalitning ikkinchi qismi – TeamId xususiyati hisoblanadi. Navigatsion xususiyat bilan bog‘lanishda tashqi kalit nomi quyidagilardan biriga mos bo’lishi shart:
Navigatsion_xususiyat_nomi+Bog‘langan_jadvaldagi_kalit_nomi – bizning misolda navigatsion xususiyat nomi Team, Team modelidagi kalit - Id, shuning uchun ushbu hol uchun xususiyat TeamId kabi aniqlangan.
Bog‘langan_jadval_klass_nomi+Bog‘langan_jadvaldagi_kalit_nomi – bizning holda klass - Team, Team modeldagi kalit - Id, shuning uchun ushbu hol uchun xususiyat TeamId kabi aniqlangan.
Tashqi kalit bog‘langan ma’lumotlarni olishga xizmat qiladi. Code First yondashuvi orqali DB generatsiya qilinganidan so’ng, Players jadvali quyidagicha tashkil qilingan edi:
CREATE TABLE [dbo].[Players] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[Name] NVARCHAR (MAX) NULL,
[Position] NVARCHAR (MAX) NULL,
[Age] INT NOT NULL,
[TeamId] INT NULL,
CONSTRAINT [PK_dbo.Players] PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [FK_dbo.Players_dbo.Teams_TeamId] FOREIGN KEY ([TeamId]) REFERENCES [dbo].[Teams] ([Id])
);
Tashqi kalitni aniqlashda quyidagilarga e'tibor berish lozim. Agar tashqi kalitdagi oddiy xususiyat tipi int? kabi aniqlangan bo’lsa (ya’ni null qiymatga teng bo’lishi mumkinligi), DBda hosil qilinadigan maydon, NULL qiymatni qabul qilish mumkin: [TeamId] INT NULL
Ammo biz Player klassida TeamId tipini int: public int TeamId { get; set; } kabi aniqlasak, ushbu xususiyatga mos maydon NOT NULL cheklagichga ega bo’ladi. Tashqi kalit esa kaskadli o’chirishni aniqlaydi:
CREATE TABLE [dbo].[Players] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[Name] NVARCHAR (MAX) NULL,
[Position] NVARCHAR (MAX) NULL,
[Age] INT NOT NULL,
[TeamId] INT NOT NULL,
CONSTRAINT [PK_dbo.Players] PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [FK_dbo.Players_dbo.Teams_TeamId] FOREIGN KEY ([TeamId]) REFERENCES [dbo].[Teams] ([Id]) ON DELETE CASCADE
);
Bog‘langan ma’lumotlarni olish
Entity Framework da bog‘langan ma’lumotlarni turli usullarda olish mumkin. Ularning biri «ochko’z yuklash» yoki «eager loading» deb nomlanadi. Ushbu usul orqali bog‘langan ma’lumotlarni tashki kalit bo’yicha Include metodi orqali olish mumkin. Yuqoridagi misolda barcha futbolchilarni ularning jamoalari bilan birga olamiz:
using (SoccerContext db = new SoccerContext())
{
IEnumerable players = db.Players.Include(p => p.TeamId);
foreach (Player p in players)
{
MessageBox.Show(p.Team.Name);
}
}
Include metodini ishlatmasdan, bog‘langan ma’lumotlarga ega bo’lmasdik va p.Team.Name xususiyatga murojaat qilib bo’lmas edi.
Bog‘langan ma’lumotlarni olishning ikkinchi usuli «ishyoqmas yuklash» yoki lazy loading deb yuritiladi. Ushbu usulda agar ob’ektga murojaat qilinganda bog‘langan ma’lumotlar zarur bo’lmasa, ular yuklanmaydi. Ammo navigatsion xususiyatga birinchi bor murojaat qilinganda ushbu ma’lumotlar avtomatik tarzda DBdan yuklanadi.
«Ishyoqmas yuklash» usuli ishlatilganda klasslarni e’lon qilishda ba’zi qoidalarga rioya qilish lozim. Avvalo «ishyoqmas yuklash»ni amalga oshiruvchi klasslar public statusiga, ularning xususiyatlari esa public va virtual kabi modifikatorlarga ega bo’lishi lozim. Misol, Player va Team klasslari quyidagicha tarzda aniqlanishi lozim:
public class Player
{
public int Id { get; set; }
public string Name { get; set; }
public string Position { get; set; }
public int Age { get; set; }
public int? TeamId { get; set; }
public virtual Team Team { get; set; }
}
public class Team
{
public int Id { get; set; }
public string Name { get; set; } // jamoa nomi
public string Coach { get; set; } //trener
public virtual ICollection Players { get; set; }
public Team()
{
Players = new List();
}
}
Program.cs fаyli quyidagicha:
using System;
using System.Collections.Generic;
using System.Text;
namespace OneToOneApp
{
class Program
{
static void Main(string[] args)
{
using (SoccerContext db = new SoccerContext())
{
// Barcha o’yinchilar tegishli Jamoaлар ro’yxati
IEnumerable players = db.Players;
foreach (Player p in players)
{
Console.WriteLine("{0} - {1}", p.Team.Name, p.Name);
}
Console.WriteLine();
//Barcha Jamoaлар va undagi o’yinchilar
IEnumerable teams = db.Teams;
foreach (Team t in teams)
{
Console.WriteLine("{0}. {1}",t.Id,t.Name);
IEnumerable ps = t.Players;
foreach (Player p in ps)
{
Console.WriteLine("\t{0}. {1}", p.Id, p.Name);
}
}
}
Console.ReadLine();
}
}
}
Endi Entity Framework orqali loyihada modellarni bog‘lash usullarini ko’rib chiqamiz.
Birga-bir bog‘lanish
|