عملیات CRUD در ASP.NET Core MVC وبروزرسانی دات نت فریمورک – جلسه ۴۸

CRUD Repository & .NET Framework Upgrade - Session48

در این جلسه قصد داریم به پیاده سازی عملیات CRUD در ASP.NET Core MVC بپردازیم. به علاوه، در ادامه این جلسه، دات نت فریمورک وب اپلیکیشن خود را بروزرسانی خواهیم کرد. ما دراین جلسه اینترفیس و ریپازیتوری مدل Cost خود را تکمیل خواهیم کرد تا عملیات CRUD که مخفف Create, Read, Update و Delete خواهد بود را انجام دهد. عملیات CRUD در واقع به عملیات اصلی ایجاد، خواندن، بروزرسانی و حذف داده در پایگاه داده و یا داده ایستا گفته میشود. همچنین در این جلسه علاوه بر تکمیل ریپازیتوری ایستا، مدل Cost یک ریپازیتوری برای انجام عمیات ذکر شده بروی پایگاه داده SQL را ایجاد خواهیم کرد.

عملیات CRUD چیست؟

کلمه CRUD مخفف کلمات Create, Read, Update و Delete میباشد که همان عملیات اصلی بروی داده ها میباشد. در واقع به مجموع عملیات ایجاد، خواندن، بروزرسانی و حذف داده بروی پایگاه داده عملیات CRUD گفته میشود.

ایجاد اینترفیس و ریپازیتوری برای عملیات CRUD در ASP.NET Core MVC

ما در جلسات پانزدهم و شانزدهم از این دوره آموزشی در خصوص اینترفیس (Interface)، ریپازیتوری (Repository) و تزریق وابستگی (Dependency Injection) با جزیئات کامل صحبت نمودیم. حال در این جلسه قصد داریم تا اینترفیس مربوط به مدل Cost را به گونه‌ایی تکمیل نماییم تا تمامی عملیات CRUD را پشتیبانی نماید.

    public interface ICostRepository
    {
        Cost GetCostByID(int id);
        IEnumerable<Cost> GetAllCost();
        Cost Create(Cost NewCost);
        Cost Update(Cost UpdateCost);
        Cost Delete(int id);
    }

همانگونه که مشاهده مینمایید ما برای عملیات نوشتن، خواندن، بروزرسانی و حذف، متدهایی را درون ICostRepository که یک اینترفیس (Interface) میباشد تعریف نمودیم.

حال به پیاده‌سازی تمامی متدهای تعریف شده در ریپازیتوری StaticCostRepository خواهیم پرداخت.

نوشتن بروی داده‌های ایستا.

        public Cost Create(Cost NewCost)
        {
            costs.Add(NewCost);
            return NewCost;
        }

خواندن داده‌ از اطلاعات ایستا (بازیابی تمامی رکوردها و یا یک رکورد با شناسه خاص).

        public IEnumerable<Cost> GetAllCost()
        {
            return costs;
        }

        public Cost GetCostByID(int id)
        {
            return costs.FirstOrDefault(c => c.ID == id);
        }

بروزرسانی اطلاعات بروی داده‌های ایستا.

        public Cost Update(Cost UpdateCost)
        {
            Cost SelectedCost = costs.FirstOrDefault(x => x.ID == UpdateCost.ID);
            if (SelectedCost != null)
            {
                SelectedCost.Amount = UpdateCost.Amount;
                SelectedCost.RegisteredDate = UpdateCost.RegisteredDate;
                SelectedCost.CategoryID = UpdateCost.CategoryID;
                SelectedCost.Comment = UpdateCost.Comment;
                SelectedCost.PaymentMethod = UpdateCost.PaymentMethod;
                return UpdateCost;
            }
            return null;
        }

حدف یک رکورد از داده ایستا.

        public Cost Delete(int id)
        {
            Cost SelectedCost = costs.FirstOrDefault(x => x.ID == id);
            if(SelectedCost!= null)
            {
                costs.Remove(SelectedCost);
                return SelectedCost;
            }
            return null;
        }

کد کامل مربوط به ریپازیتوری StaticCostRepository.

    public class StaticCostRepository : ICostRepository
    {
        private List<Cost> costs = new List<Cost>
        {
            new Cost{ID=1, Amount=100.00M,RegisteredDate=new DateTime(2022,02,19),CategoryID=1,Comment="New Record",PaymentMethod=PaymentMethods.Cash  },
            new Cost{ID=2, Amount=25.00M,RegisteredDate=new DateTime(2022,02,13),CategoryID=2,Comment="New Record",PaymentMethod=PaymentMethods.Credit  },
            new Cost{ID=3, Amount=700.00M,RegisteredDate=new DateTime(2022,02,11),CategoryID=3,Comment="New Record",PaymentMethod=PaymentMethods.Debit  }
        };

        public Cost Create(Cost NewCost)
        {
            costs.Add(NewCost);
            return NewCost;
        }

        public Cost Delete(int id)
        {
            Cost SelectedCost = costs.FirstOrDefault(x => x.ID == id);
            if(SelectedCost!= null)
            {
                costs.Remove(SelectedCost);
                return SelectedCost;
            }
            return null;
        }

        public IEnumerable<Cost> GetAllCost()
        {
            return costs;
        }

        public Cost GetCostByID(int id)
        {
            return costs.FirstOrDefault(c => c.ID == id);
        }

        public Cost Update(Cost UpdateCost)
        {
            Cost SelectedCost = costs.FirstOrDefault(x => x.ID == UpdateCost.ID);
            if (SelectedCost != null)
            {
                SelectedCost.Amount = UpdateCost.Amount;
                SelectedCost.RegisteredDate = UpdateCost.RegisteredDate;
                SelectedCost.CategoryID = UpdateCost.CategoryID;
                SelectedCost.Comment = UpdateCost.Comment;
                SelectedCost.PaymentMethod = UpdateCost.PaymentMethod;
                return UpdateCost;
            }
            return null;
        }
    }

ایجاد ریپازیتوری برای انجام عملیات CRUD بروی SQL Server

برای انجام عملیات نوشتن، خواندن، بروزرسانی و حذف بروی پایگاه داده SQL Server ابتدا میبایست مدل مورد نظر را به صورت یک خصوصیت DbSet به DBContext وب اپلیکیشن خود اضافه نماییم.

    public class WebAppDBContext : DbContext
    {
        public WebAppDBContext(DbContextOptions<WebAppDBContext> options) : base(options)
        {
        }
        public DbSet<Category> Categories { get; set; }
        public DbSet<Cost> Costs { get; set; }
    }

حال یک کلاس درون پوشه Models برای ریپازیتوری مورد نظر ایجاد میکنیم. این کلاس هم میبایست از اینترفیس مربوطه ارث‌بری داشته باشد. همچنین برای ارتباط با پایگاه داده میبایست DBContext را بوسیله سازنده (Constructor) به کلاس تزریق نماییم.

    public class SQLServerCostRepository : ICostRepository
    {
        private readonly WebAppDBContext context;

        public SQLServerCostRepository(WebAppDBContext _context)
        {
            context = _context;
        }
    }

سپس اقدام به پیاده‌سازی تمامی متدهای مورد نیاز مینماییم.

کد مربوط به عملیات نوشتن درون پایگاه داده.

        public Cost Create(Cost NewCost)
        {
            context.Costs.Add(NewCost);
            context.SaveChanges();
            return NewCost;
        }

کد مربوط به عملیات خواندن (تمامی رکوردها و یک رکورد با مشخصه ها) از پایگاه داده.

        public IEnumerable<Cost> GetAllCost()
        {
            return context.Costs;
        }

        public Cost GetCostByID(int id)
        {
            return context.Costs.FirstOrDefault(x => x.ID == id);
        }

برای به بروزرسانی داده در پایگاه داده از دو روش میتوان استفاده نمود:

روش اول، یافتن رکورد مورد نظر و بروزرسانی فیلدهای مورد نیاز و ذخیره سازی بروزرسانی.

        public Cost Update(Cost UpdateCost)
        {
            Cost SelectedCost = context.Costs.FirstOrDefault(x => x.ID == UpdateCose.ID);
            if (SelectedCost != null)
            {
                SelectedCost.Amount = UpdateCose.Amount;
                SelectedCost.RegisteredDate = UpdateCose.RegisteredDate;
                SelectedCost.CategoryID = UpdateCose.CategoryID;
                SelectedCost.Comment = UpdateCose.Comment;
                SelectedCost.PaymentMethod = UpdateCose.PaymentMethod;
                context.SaveChanges();
                return UpdateCose;
            }
            return null;
        }

روش دوم، پیوست کردن داده‌های جدید و تغییر وضعیت آن به حالت Modified.

        public Cost Update(Cost UpdateCost)
        {
            var SelectedCost = context.Costs.Attach(UpdateCost);
            SelectedCost.State = Microsoft.EntityFrameworkCore.EntityState.Modified;
            context.SaveChanges();
            return UpdateCost;
        }

سورس کد کامل مربوط به SQLServerCostRepository.

    public class SQLServerCostRepository : ICostRepository
    {
        private readonly WebAppDBContext context;

        public SQLServerCostRepository(WebAppDBContext _context)
        {
            context = _context;
        }
        public Cost Create(Cost NewCost)
        {
            context.Costs.Add(NewCost);
            context.SaveChanges();
            return NewCost;
        }

        public Cost Delete(int id)
        {
            Cost SelectedCost = context.Costs.FirstOrDefault(x => x.ID == id);
            if (SelectedCost != null)
            {
                context.Costs.Remove(SelectedCost);
                context.SaveChanges();
                return SelectedCost;
            }
            return null;
        }

        public IEnumerable<Cost> GetAllCost()
        {
            return context.Costs;
        }

        public Cost GetCostByID(int id)
        {
            return context.Costs.FirstOrDefault(x => x.ID == id);
        }

        public Cost Update(Cost UpdateCost)
        {
            var SelectedCost = context.Costs.Attach(UpdateCost);
            SelectedCost.State = Microsoft.EntityFrameworkCore.EntityState.Modified;
            context.SaveChanges();
            return UpdateCost;
        }
    }

تغییر ریپازیتوری فعال

ما قبلا در خصوص تعریف ریپازیتوری (Repository) فعال در جلسات گذشته صحبت نموده‌ایم. در این جلسه همچنین به شما نشان خواهیم داد که چگونه به سادگی و با کمک تزریق وابستگی میتوان با توجه به نیاز خود، ریپازیتوری فعال را تغییر دهیم. به این منظور میبایست تغییراتی در کلاس Startup و متد ConfigureServices اعمال نماییم.

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContextPool<WebAppDBContext>
                (options=> options.UseSqlServer(Configuration.GetConnectionString("CostDBConnectionSQLServer")));
            services.AddControllersWithViews();
            services.AddScoped<ICostRepository, SQLServerCostRepository>();
        }

همانگونه که مشاهده میکنید با تعریف یک سرویس و تغییر ریپازیتوری متصل به اینترفیس، میتوانیم ریپازیتوری فعال را تغییر دهیم.

بروزرسانی دات نت فریمورک

برای بروزرسانی دات نت فریمورک (Upgrade .NET Framework) یک وب اپلیکیشن ASP.NET Core MVC میتوانید از این لینک که برای بروزرسانی از نسخه 5 به نسخه 6 میباشد کمک بگرید. اما به صورت کلی شرایط بروزرسانی با توجه به محیط توسعه و سیستم‌عامل کامپیوتر شما متفاوت میباشد.

بروزرسانی دات نت فریمورک

در تصویر فوق، شرایط بروزرسانی دات نت فریمورک در شرایط مختلف بیان گردیده است. از آنجایی که ما از سیستم‌عامل ویندوز و ویژوال استدیو استفاده میکنیم، میبایست نسخه ویژوال استدیو خود را به 2022 تغییر دهیم. سپس از قسمت Properties وب اپلیکشن خود Framework Target را در قسمت Application-General به نسخه 6 تغییر میدهیم.

Web Application Properties

همچنین برای کارآیی بهتر وب‌اپلیکیشن خود و سازگاری با فریمورک جدید بهتر است NuGet Packageهای نصب شده را نیز بروزرسانی نمایید. در ویدیو آموزشی این جلسه میتوانید روش بروزرسانی NuGet Package ها را نیز مشاهده نمایید.

در صورت نیاز به جزئیات بیشتر، میتوانید ویدئو آموزشی این جلسه را تماشا نمایید. همچنین برای آگاهی از جلسات بعدی این دوره آموزشی، ما را در اینستاگرام، تلگرام، یوتیوب و آپارات دنبال کنید. ضمنا لیست کامل جلسات در این قسمت در دسترس شما میباشد و سورس کد این جلسه را میتوانید از GitHub ما دانلود نمایید.

تماشای ویدیو در یوتیوب ما

دانلود اسلایدهای آموزشی این جلسه از اینجا

برچسب ها

0 0 رای ها
امتیازدهی به مقاله
اشتراک در
اطلاع از
guest
0 نظرات
بازخورد (Feedback) های اینلاین
مشاهده همه دیدگاه ها
0
افکار شما را دوست داریم، لطفا نظر دهید.x