Entity Framework II

Өмнөх хичээлд бид өгөгдлийн сантай ажиллах Entity Framework технологи гэж юу болох, өгөгдлийн сантай ажиллахад шаардлагатай хэрэгслүүд, тэдгээрийг хэрхэн суулгахыг үзээд өгөгдлийн сан үүсгэн түүнд хандах жижигхэн програмыг зохиосон. Энэ хичээлээр өмнөх хичээлд бичсэн програмын код хэрхэн ажиллаж байгааг үргэлжлүүлэн судлах болно. Програмын кодыг сануулбал

using DbDemo.Properties;
using System;
using System.Data;
using System.Data.SqlClient;

namespace DbDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            using (IDbConnection connection = new SqlConnection(Settings.Default.DbConnect))
            {
                IDbCommand command = new SqlCommand("SELECT * FROM t_customers");
                command.Connection = connection;
                connection.Open();
                IDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    Console.WriteLine("Id: {0}\t Нэр: {1}", reader.GetInt32(0),
                        reader.GetString(1));
                }
            }
            Console.ReadLine();
        }
    }
}

гэж байгаа.

Програм өгөгдлийн сангаас мэдээлэл авах учраас түүнтэй холбогдохын тулд IDbConnection интерфейсийг хэрэгжүүлсэн классын шинэ хувийг үүсгэнэ. .NET фреймворкт энэ интерфейсийн хэрэгжүүлэлт стандартаар орсон байдаг тул бид програмын эхний мөрөнд IDbConnection интерфейсийн хэрэгжүүлэлт болох SqlConnection классын хувийг үүсгэсэн. Классын байгуулагчид холболтын мөр шаардлагатай тул түүнийг App.config файлаас Settings классаар дамжуулан Settings.Default.DbConnect гэж авна. Settings классыг боловсруулалтын орчин програмын тохиргоог үүсгэхэд автоматаар төслийн Settings.settings дотор байрлах Settings.Desinger.cs файлд тодорхойлон өгдөг. Програмын эхний мөрөөр холболтын мөрийг өгөн шинэ холболтын хувийг бий болгосон. Дараа нь бид өгөгдлийн сан гүйцэтгэх командыг IDbCommand command = new SqlCommand("SELECT * FROM t_customers"); гэж заан өгнө. Энд бид бас л .NET фреймворкт IDbCommand интерфейсийн стандарт хэрэгжүүлэлт болох SqlCommand классыг ашигласан. Классын байгуулагчид өгөгдлийн сан биелүүлэх ёстой Sql шаардлагыг өгнө. Шаардлага бол t_customers хүснэгтийн бүх мэдээллийг татан авах. Үүсгэсэн командын холболтын шинжид өгөгдлийн сангийн холбоосыг command.Connection = connection; гэж олгоно. Өгөгдлийн сантай ажиллахын өмнө түүний холболтыг нээх хэрэгтэй. Үүнийг connection.Open(); оператор гүйцэтгэнэ. Дараагийн оператор SQL Server өгөгдлийн санд манай командыг дамжуулан гүйцэтгүүлээд өгөгдлийн багцыг буцаан авна. Цаашаа серверээс татан авсан өгөгдлүүдийн багцыг циклээр гүйлгэн уншиж reader -ийн аргуудыг ашиглан дэлгэц дээр харуулна. reader.GetInt32(0) арга хүснэгтийн эхний баганы өгөгдлийг Int төрөлд харин reader.GetString(1) арга хүснэгтийн хоёрдугаар баганы өгөгдлийг мөр төрлийн болгож байгаа юм.
Өгөгдлийн сантай ийм аргачлалаар ажиллахад олон тооны дутагдалтай талууд байгааг та анзаарч байгаа байх. Дээрх код бол Entity Framework технологийг ашигласан хэлбэр биш өгөгдлийн сантай ADO.NET -ийг ашиглан доод түвшинд харьцаж буй хэлбэр болно. Гэхдээ Entity Framework ч эцсийн түвшиндээ өгөгдлийн сантай бас л ийм хэлбэрээр харьцдаг ч програм зохиогчид ажиллахад таатай орчинг бий болгодогоороо л давуу. Өгөгдлийн сантай харьцсан дээрх кодод ямар дутагдлууд байгааг дурдвал:

  1. Sql шаардлагын бичлэгийг C# код дотор "SELECT * FROM t_customers" гэж шууд мөр хэлбэрээр ашиглаж байгаа. Sql шаардлагын бичлэгт хүснэгт, баганы нэрийг буруу бичих зэргээр дүрмийн алдааг маш амархан гаргах магадлалтай. Үүнээс гадна кодод рефакторинг хийх бараг боломжгүй. Өөрөөр хэлбэл шаардлага зөв бичигдсэн эсэхийг шалгах боломжгүй.  
  2. Бид холболтыг хэзээ нээх, хэзээ хаах гэх мэтээр удирдах ажиллагааг хянаж байх хэрэгтэй. Манай холболтын обьект удирдлагагүй нөөцөд хамааралтай учраас бид түүний удирдлагыг өөрсдөө хянах ёстой. Энэ бүгдийг хянах нь тийм ч хүнд биш тул онцын хүндрэлгүй.   
  3. Бид төрөлжөөгүй үр дүнтэй ажиллана. Энэ бол хамгийн төвөгтэй асуудал. Програмаас ExecuteReader() аргыг дуудахад түүнээс ямар зүйлүүдийг агуулсан өгөгдлийн багцыг буцаахыг бид мэдэхгүй учраас түүнийг гүйлгэн уншихдаа аль хүснэгтийн ямар багана ямар төрлийн өгөгдлүүдийг хадгалж байгааг урьдчилан мэдэж байх хэрэгтэй. ORM технологи гарч ирэхээс өмнө програм зохиогчид бүгд л ийм төрөлжөөгүй обьектыг аван тохирох төрөлд нь шилжүүлэн ажиллаж байсан.
  4. Өгөгдлийн сангаас авсан мэдээллүүдийг дэлгэц дээр харуулж болох ч өгөгдлүүдтэй програм цаашид ажиллаж хэрэгтэй болбол яах вэ?

гээд асуудлууд байна аа. Програмд өгөгдлийн сангаас мэдээллийг татан авч үзүүлэхийн дээр түүнтэй ажиллах шаардлага байнга гардаг. Үүнийг шийдэхийн тулд ямар нэгэн классыг бичээд өгөгдлүүдийг тухайн классын хувьд хадгалаад дараа нь энэ хувьтай ажиллах арга байна. Үүнийг хэрхэн хэрэгжүүлэхийг авч үзье. Програмдаа t_customers хүснэгтийн багануудад харгалзсан шинжүүдийг

namespace DbDemo
{
    public class CustomerInfo
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
}

тодорхойлсон CustomerInfo классыг нэмээд удирдах програмын кодын өгөгдлийн сангаас мэдээллийг татан авах кодыг

        private static List<CustomerInfo> GetCustomers()
        {
            using (IDbConnection connection = new SqlConnection(Settings.Default.DbConnect))
            {
                IDbCommand command = new SqlCommand("SELECT * FROM t_customers");
                command.Connection = connection;
                connection.Open();
                IDataReader reader = command.ExecuteReader();
                List<CustomerInfo> customers = new List<CustomerInfo>();
                while (reader.Read())
                {
                    CustomerInfo customer = new CustomerInfo();
                    customer.Id = reader.GetInt32(0);
                    customer.Name = reader.GetString(1);
                    customers.Add(customer);
                }
                return customers;
            }
        }

GetCustomers аргад оруулъя. Арга өмнөх кодтой бараг ижилхэн үйлдлийг хийх ч үр дүнг дэлгэц рүү гаргахын оронд түүнийг CustomerInfo төрлийн жагсаалт болгоно. Ингэснээр бид өгөгдлийн сангаас буцаах төрөлжөөгүй үр дүнг төрөлжүүлсэн жагсаалт болгож байгаа хэрэг. Дараа нь бид харилцагчдын жагсаалтыг консолд үзүүлэх аргад

        static void Main(string[] args)
        {
            var customers = GetCustomers();

            foreach (var customer in customers)
            {
                Console.WriteLine("Id: {0}\t Нэр: {1}", customer.Id,
                        customer.Name);
            }
            Console.ReadLine();
        }

гэж ашиглана. Одоо бид хэрэглээний кодын хүрээнд төрөлжсөн өгөгдлүүдтэй ажиллах боломжтой болсон. Програмыг ажлуулбал

өмнөхтэй ижил үр дүнг авна. Дээрх жишээнд бидний хийсэн зүйл бол төрөлжүүлээгүй өгөгдлүүдийг CustomerInfo класст оруулан тэдгээрийг ашиглахад эвтэйхэн болгон төрөлжүүлсэн явдал байлаа. Эндээс манай t_customers хүснэгт CustomerInfo классууд нилээд ижилхэн төрлийнх гэдгээс үүдэн өгөгдлийн сангийн хүснэгтүүдээс үндэслэн манай завсарын классуудыг эсхүл манай классуудааас өгөгдлийн сангийн хүснэгтүүдийг автоматаар үүсгэдэг хэрэгсэл байвал хичнээн тустай гэсэн санаа төрнө. Entity Framework болон бусад ORM технологийн гол санаа нь өгөгдлийн сангийн обьектууд ба хэрэглэний классууд хооронд харьцааг бий болгох юм. Энэ хүртэл үзсэн зүйлүүд бол өгөгдлийн сантай ажиллах уламжлалт аргыг ойлгоход зориулагдсан байлаа. ORM технологийг хэрэглэхгүйгээр өгөгдлийн сантай ажиллах тийм ч амархан зүйл биш гэдгийг харуулах зорилгоор дээрх жишээг авч үзсэн юм.

Өгөгдлийн сантай ORM технологийг ашиглан хэрхэн ажиллахыг дараагийн хичээлээс үзээрэй.

Мэдээлэл таалагдсан бол найзуудтайгаа хуваалцаарай.

  Нээгдсэн тоо: 635 Төлбөртэй

Класс ба структурт ердийн талбар, арга, шинжүүдээс гадна статик талбар, арга, шинжүүд байж болдог. Статик талбар, арга, шинжүүд бүх класс, структурт хамаарна. Классийн статик гишүүнд хандахдаа классийн хувийг үүсгэх албагүй.

Статик талбар

Статик талбар класс ба структурийн төлвийг хадгална. Статик талбаруудыг ердийн талбарууд шиг тодорхойлох ч талбарын төрлийн өмнө static түлхүүр үгийг тавьдаг.

  Нээгдсэн тоо: 2395 Бүртгүүлэх

Exception бол програмчлалын олон хэлэнд байдаг алдааг боловсруулах стандарт механизм. Өмнөх хичээлд С# дээр алдааны боловсруулалтыг хэрхэн үүсгэн хэрэгжүүлэхийг авч үзсэн. Энэ хичээлээр алдааны боловёруулалтыг хэрхэн хийхийг үргэлжлүүлэн үзэх тул эхлээд Алдааны боловсруулалт /Exceptions/ I хичээлийг үзэхийг зөвлөе.

  Нээгдсэн тоо: 1504 Төлбөртэй

 үүсвэр:

Өмнөх хичээлээр бид делегатын талаар тодорхой авч үзсэн. Энэ хичээлээр өмнөх хичээлд үзсэн зүйлүүдийг үргэлжлүүлэн үйл явдал гэдэг ойлголтыг авч үзнэ. Иймээс хичээлийн материалыг үзэхийн өмнө Делегат ба үйл явдал 1 хичээлийг сайтар судлан ойлгосон байх шаардлагатай.

Нэгдсэн /ерөнхийлөгдсөн/ делегат.

Дараах дохиолдолыг авч үзье. Бидэнд void (string) тодорхойлогчид тохирох аргад холбоотой CountDelegate гэсэн делегат байлаа гэж үзье. Яваандаа програмын ажиллагааны кодод void (string) тодорхойлогчид тохирох аргад холбоотой бас нэгэн TimesDelegate гэсэн делегат хэрэгтэй болох тохиолдол гарч ирэх бүрэн боломжтой. Ийм байдлаар 3 дахь 4 дэхь тохиолдлууд гарч болно.

  Нээгдсэн тоо: 556 Төлбөртэй

Өмнөх хичээлүүдэд int, byte, double, string, object гэх мэтийн өгөгдлийн төрлүүдийг үзсэн. Үүний зэрэгцээ структур, тооллого /enum/, класс зэрэг нарийн төрлүүдийг ч үзсэн. Энэ бүх төрлүүдийг утгын төрлүүд (утгатай төрлүүд ч гэж бас нэрлэдэг) (value types) ба холбоосын төрлүүд (reference types) гэсэн ангилалд хувааж болно. Эдгээрийн ялгааг ойлгох нь чухал.

Үйл явдал /event/ тодорхой үйлдэл хийгдсэн талаар системд мэдэгддэг. Хэрвээ бид энэхүү үйлдлийг ажиглах хэрэгтэй бол яг энд…

Нээгдсэн тоо : 381

 

Манай төсөл олон хуудсуудтай болон тэдгээрийн хооронд динамикаар шилжилт хийж байгаа ч тухайн үед шилжилт хийгдсэн хуудаст тохирох…

Нээгдсэн тоо : 476

 

Зочин (Visitor) паттерн классуудыг өөрчлөхгүйгээр тэдгээрийн обьектуудын үйлдлийг тодорхойлох боломжийг олгоно. Зочин хэвийг ашиглахдаа классуудын хоёр ангилалыг тодорхойлно.…

Нээгдсэн тоо : 453

 

Лямбда-илэрхийлэл нь нэргүй аргын хураангуй бичилтийг илэрхийлнэ. Лямбда-илэрхийлэл утга буцаадаг, буцаасан утгыг өөр аргын…

Нээгдсэн тоо : 528

 

Кодийн сайжруулалт /рефакторинг/ хичээлээр програмийн кодоо react -ийн зарчимд нийцүүлэн компонентод салгасан.…

Нээгдсэн тоо : 592

 

Хадгалагч (Memento) хэв обьектын дотоод төлвийг түүний гадна гаргаж дараа нь хайрцаглалтын зарчмыг зөрчихгүйгээр обьектыг сэргээх боломжийг олгодог.

Нээгдсэн тоо : 591

 

Делегаттай нэргүй арга нягт холбоотой. Нэргүй аргуудыг делегатийн хувийг үүсгэхэд ашигладаг.
Нэргүй аргуудын тодорхойлолт delegate түлхүүр үгээр…

Нээгдсэн тоо : 732

 

Математикт харилцан урвуу тоонууд гэж бий. Ямар нэгэн тооны урвуу тоог олохдоо тухайн тоог сөрөг нэг зэрэг дэвшүүлээд…

Нээгдсэн тоо : 875

 

Төсөлд react-router-dom санг оруулан чиглүүлэгчдийг бүртгүүлэн тохируулсан Санг суулган тохируулах хичээлээр бид хуудас…

Нээгдсэн тоо : 864

 
Энэ долоо хоногт

олон гишүүнтийн язгуурууд x1, x2, x3 (x1<x2<x3) бол
1.
2. x1, x2, x3 арифметик прогрес үүсгэх бол
3. Уул прогрессын ялгавар
4.

Нээгдсэн тоо : 1332

 

sin90 -ийг олно уу.

Жич: Хатуу самар даа. Сурагчид барна гэхэд хүнд болов уу. ЕБС-ийн хүрээний аргаар л бодолтыг хийж байгаа тул бодолтыг харвал гайгүй ч юм шиг санагдаж магадгүй гоё бодлого.

Нээгдсэн тоо : 544

 

тэгшитгэлийг бод.

Жич: Бодох арга орж ирж байна уу. Найз нөхөд, багштайгаа хамжаад үзээрэй. Иймэрхүү бодлогууд сэтгэлгээг хөгжүүлэх, арга техникт суралцахад тустай. 

Нээгдсэн тоо : 806