Entity Framework 6


Player klassidagi public Team Team { get; set; } xususiyati - navigatsion xususiyat



Yüklə 1,54 Mb.
səhifə18/54
tarix17.06.2023
ölçüsü1,54 Mb.
#132013
1   ...   14   15   16   17   18   19   20   21   ...   54
EntityFramework(6,u) uzb

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 fayli 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 uyinchilar tegishli Jamoalar ruyxati
IEnumerable players = db.Players;
foreach (Player p in players)
{
Console.WriteLine("{0} - {1}", p.Team.Name, p.Name);
}

Console.WriteLine();


// Barcha Jamoalar va undagi uyinchilar
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

Yüklə 1,54 Mb.

Dostları ilə paylaş:
1   ...   14   15   16   17   18   19   20   21   ...   54




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©azkurs.org 2025
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin