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

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

  Нээгдсэн тоо: 2913 Нийтийн

Бид C# төрлийн бүрэлдхүүн хичээлүүдэд төрлийн Үйл явдлууд /Events/ ухагдхуунаас бусад гишүүдийг үзсэн. Иймээс энэ хичээлд Үйл явдлууд /Events/ ойлголтын талаар авч үзье. Үйл явдал делегат /delegate/ гэдэг ойлголт дээр суурилдаг учраас эхлээд делегат ухагдхууныг авч үзээд дараа нь үйл явдал гишүүний талаар авч үзье Delegate гэсэн үгийг монголчилбол "төлөөлөгч" гэж хэлж болох юм. Гэхдээ би делегат гэсэн нэрээр нь шууд ойлгон тогтоон авах нь илүү гэж үзлээ.

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

Entity Framework -ийн талаарх өмнөх хичээлүүдэд бид MSSQL серверт энгийн өгөгдлийн сан үүсгээд түүнд ADO NET -ээр хандах стандарт арга болон EF технологийг ашиглан хандахыг үзсэн. Entity Framework -ийг ашиглан өгөгдлийн санд хандах код нь стандарт аргаас хамаагүй бага бөгөөд уншин ойлгоход амархан байсныг харсан. Одоо програмын кодоос EF технологиор өгөгдлийн санд хандаж болох аргуудын талаар авч үзье.

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

Өгөгдлйн сангаас ID нь 1 тэй тэнцүү харилцагчийн нэрийг өөрчлөх код

    class Program
    {
        static void Main(string[] args)
        {
            var context = new TestDbContext();

            var customer = context.Customers.Single(c => c.CustomerId == 1);
            customer.CustomerName = "А.Ягаан";

            context.SaveChanges();

            Console.ReadLine();
        }
    }

гэж бичигдэнэ. Програмыг ажлуулаад өгөгдлийн сангийн t_customer хүснэгтийг нээн харвал өгөгдөлд өөрчлөлт орсон байгаа. Энд бас нэгэн анхаарах зүйл бий.

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

Өөрөө өөрийгөө дуудах функцийг рекурсив (recursion) гэж нэрлэдэг. Рекурсивийг мэдээлэл зүйн үндсэн ойлголтуудын нэг гэж үздэг. Асуудлын шийдлийн энэхүү арга нь математик индукцтэй төстэй. Өөрөөр хэлбэл функц өөрийгөө дуудахын тулд эхлээд функцийг өөр утгатайгаар дуудсан үр дүнг авсан байх хэрэгтэй болдог.
Функц өөрөө өөрийгөө дуудах ажиллагаа програмчлалын ихэнх хэлүүдэд байдаг тул ухагдхууныг ойлгон хэрэгжүүлж сурсан байх хэрэгтэй. Рекурсивийн (recursion) хэрэгжүүлэлтийг тодорхой шийдлүүд дээр харцгаая.

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

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

Тэгш өнцөгт параллелепипедын диагнал түүний 3 ба 4 хэмжээтэй талстад 60 градусын өнцгөөр налсан бол диагоналын урт хэд вэ?

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

 

Суурийн радиус нь 4 см байх шулуун дугуй цилиндрийн нэг үзүүрээс зурагт үзүүлснээр хавтгайгаар огтлоход хамгийн урт байгуулагч нь 15 см, хамгийн богино байгуулагч нь 9 см болсон бол үүссэн биетийн эзэлхүүнийг ол.

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

 

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

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