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 технологийг ашиглан хэрхэн ажиллахыг дараагийн хичээлээс үзээрэй.

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

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

Хүмүүс ОХП -ийн аргачлалыг дэмждэг хэлийг ашигласан бол энэ парадигмаар кодлоод байна гэж буруу бодох гээд байдаг. C# -ийн дотоод сангууд бүгд ОХП -д дээр суурилан ажилладаг тул таны код энэ аргачлалаар бичигдээд байгаа юм шиг харагдаж магадгүй. Обьект гэдэг нь өөртөө өгөгдөл, аргуудыг агуулсан кодлогч үүсгэх өгөгдлийн төрөл. Түүнээс ямар нэгэн супер зүйл ердөө биш. C# -ийн өгөгдлийн суурь төрлүүд ч бас классаас үүсдэг обьектууд. Үүний ижлээр асуудлыг эвтэйхэн, амар шийдэх боломжийг ОХП бидэнд олгож байгаа юм. Түүгээр ч зогсохгүй C# -ийн өгөгдлийн суурь төрлүүдийн классуудыг ч өөрийн хүссэнээр удирдах боломжийг өгдөг.

Байгуулагч үүсгэх

Классууд ба обьектууд хичээлд обьектыг үүсгэхдээ анхдагч байгуулагчийг ашигласан. Гэхдээ бид өөрийн байгуулагч аргыг тодорхойлж болно. Байгуулагч обьектын инициализацийг хийдэг. Хэрвээ класст байгуулагчийг тодорхойлон өгвөл анхдагч байгуулагч байхгүй болно.

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

Команд (Command) хэв тодорхой үйлдэл гүйцэтгэх шаардлагыг тусдаа обьект хэлбэрээр хайрцаглах боломжийг олгодог. Үйлдэл гүйцэтгэх энэхүү шаардлагын обьектыг команд гэж нэрлэдэг. Ингэхдээ үйлдэл гүйцэтгэх шаардлагыг агуулсан обьектууд үйлдлийг гүйцэтгэх обьектуудаас салангид байдаг. Командуудад холбогдолтой мэдээллийг параметр хэлбэрээр дамжуулахын дээр тэдгээрийг дараалалд оруулах, дарааллаас хасаж болно.

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

Өгөгдлийн төрлүүд хичээлд төрлүүд ямар утгууд авах, санах ойд хичнээн байт эзэлдэг Арифметик үйлдлүүд хичээлээр төрлүүдэд ямар үйлдлүүдийг хийх талаар үзсэн. C# хэл хатуу төрөлжилттэй хэл тул өгөгдлийн төрлүүд, тэдгээрийн хөрвүүлэлтийг сайн ойлгох хэрэгтэй. Төрлийн хувиргалтууд голдуу нэмэх үйлдлийн үед үүсдэг тул төрөл бүрийн өгөгдлүүдэд нэмэх үйлдлийг хийхийг үзье.

byte a = 4;
int b = a + 70;

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

ОХП-д классын тухай ойлголт чухал байр суурийг эзэлдэг. Иймээс классын төрлүүдийн талаар сайтар ойлгосон байх шаардлагатай. Хичээлээр бид битүүмжлэгдсэн, статик, абстракт классуудын талаар авч үзнэ. Классын эдгээр төрлүүдийг хөнгөнөөс нь хүнд рүү нь битүүмжлэгдсэн, статик, абстракт гэсэн дарааллаар судлана.

Битүүмжлэгдсэн буюу sealed класс

Классыг тэмдэглэх sealed түлхүүр үгийн орчуулга нь битүүмжлэгдсэн гэсэн байгаа юм. Орчуулга оновчтой болоогүй байж мэдэх тул sealed class гэсэн англи нэрээр нь тогтоон авбал илүү сайн. sealed түлхүүр үг юуг илэрхийлэх, хаана хэрхэн ашиглах вэ? Хэрвээ классыг sealed түлхүүр үгээр тэмдэглэсэн бол тэр эцэг класс болж болохгүй. Өөрөөр хэлбэл sealed классаас удамшуулж болохгүй. Иймээс удамшилтын гинж sealed түлхүүр үгээр тэмдэглэгдсэн класс дээр тасрах болно.

Цэсийг нээх хаах ажиллагааг хариуцах компонентийг боловсруулсан тул энэ хичээлээр програмийн удирдах цэсийг…

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

 

Математикийн үйлдлүүдэд нэг ба тэг тоонууд онцгой шинжүүдтэй. Үржих үйлдэлд нэг ба тэг

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

 

Давталт (Iterator) паттерн нийлмэл обьектын бүх элементүүдэд тэдгээрийн дотоод бүтцийг задлахгүйгээр хандах абстракт интерфейсийг тодорхойлдог. C# хэл дээр…

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

 

Тодорхой нөхцөлд жишээ нь тоог тэгд хуваах гэх мэт тохиолдолд систем өөрөө онцгой нөхцлийн генерацийг хийдэг. Гэхдээ C#

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

 

Програмийг удирдах цэсийг нээх болон хаах ажиллагааг хариуцах компонентийг боловсруулъя. Үүний тулд төслийн components хавтаст Navigation хавтасыг үүсгээд…

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

 

Арифметикийн үндсэн 4 үйлдлийн нэг бол үржих. Нэмэх , хасах үйлдлийн талаар…

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

 

Шаблоны арга (Template Method) хэв дэд классуудад алгоритмын бүтцийг өөрчлөхгүйгээр зарим алхамуудыг дахин тодорхойлох боломж олгосон ерөнхий алгоритмыг…

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

 

Гурвалжны медиантай холбоотой бодлогууд шалгалт шүүлэгт ихээр орж ирдэг. Иймээс гурвалжны медиан, түүний шинжүүдийг бүрэн мэддэг байх хэрэгтэй.

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

 

Бүх онцгой нөхцлүүдийн суурь бол Exception төрөл. Төрөлд онцгой нөхцлийн талаарх мэдээллийг авч болох хэдэн шинжийг тодорхойлсон байдаг.…

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

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

илэрхийллийг хялбарчил

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

 

ABCD трапецийн бага диагонал BD=6 бөгөөд суурьтай перпендикуляр. Трапецийн AD=3, DC=12 бол B, D мохоо өнцгийн нийлбэрийг ол.

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

 

Геометрийн шалгалтанд сурагчид шалгалтын асуултуудаас нэг асуулт ирнэ. Сурагч "Дотоод өнцөг" сэдвийн асуултуудад хариулах магадлал 0,35 харин "Багтаасан тойрог" сэдвийн асуултуудад хариулах ммагадлал 0,2 байжээ. Шалгалтын асуултуудад энэ хоёр сэдэвт хоёуланд зэрэг хамаарах асуулт байхгүй бол сурагчид энэ хоёр сэдвийн аль нэгэнд нь хамааралтай асуулт ирэх магадлалыг ол.

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