eitaa logo
پروژه ASP.Net Core MVC (وب و سی شارپ)
121 دنبال‌کننده
168 عکس
38 ویدیو
376 فایل
❁﷽❁ آموزش 📖 برنامه نویسی ASP.Net Core MVC (وب و سی شارپ) Admin: @alialirezapanahi برنامه نویسی برنامه نویسی سی شارپ eitaa.com/sisharpapp برنامه نویسی وب eitaa.com/aspdatnet ویراستی virasty.com/alialirezapanahi آپارات aparat.com/alialirezapanahi
مشاهده در ایتا
دانلود
Test_Store => Application => Services => Products => FacadPattern => ProductFacad.cs بیایید کد ProductFacad را بررسی کنیم. این کلاس به منظور مدیریت الگوی فاساد (Facad Pattern) برای عملیات مرتبط با محصولات طراحی شده است. فاساد پترن یکی از الگوهای طراحی است که به منظور ساده‌سازی و یکپارچه‌سازی دسترسی به سیستم‌های پیچیده استفاده می‌شود. توضیحات کد: Namespace و Interface: namespace Test_Store.Application.Services.Products.FacadPattern: نام‌فضا برای سازماندهی کدها. IProductFacad: اینترفیس مربوط به کلاس ProductFacad. Class ProductFacad: این کلاس پیاده‌سازی اینترفیس IProductFacad است. Constructor (سازنده): سازنده کلاس ProductFacad که یک شیء از نوع IDataBaseContext را دریافت می‌کند. این شیء برای دسترسی به دیتابیس استفاده می‌شود. Property AddNewCategoryService: این Property یک شیء از نوع AddNewCategoryService را برمی‌گرداند. در صورتی که این شیء از قبل ایجاد نشده باشد، یک نمونه جدید از آن ایجاد می‌کند. استفاده از الگوی Singleton برای اطمینان از این که تنها یک نمونه از AddNewCategoryService وجود دارد. Property GetCategoriesService: این Property یک شیء از نوع IGetCategoriesService را برمی‌گرداند. در صورتی که این شیء از قبل ایجاد نشده باشد، یک نمونه جدید از آن ایجاد می‌کند. استفاده از الگوی Singleton برای اطمینان از این که تنها یک نمونه از GetCategoriesService وجود دارد. مزایای استفاده از Facad Pattern: سادگی و یکنواختی: فاساد پترن به شما اجازه می‌دهد تا یک رابط ساده و یکنواخت برای عملیات پیچیده ایجاد کنید. نگهداری آسان: با استفاده از این الگو، تغییرات و نگهداری کدها ساده‌تر می‌شود، زیرا تمامی دسترسی‌ها از طریق یک نقطه (فاساد) انجام می‌شود. افزایش انعطاف‌پذیری: این الگو به شما امکان می‌دهد تا به راحتی سرویس‌های جدیدی اضافه کنید یا سرویس‌های موجود را تغییر دهید، بدون این که تغییرات زیادی در سایر قسمت‌های برنامه اعمال شود. نتیجه‌گیری: کلاس ProductFacad به شما اجازه می‌دهد تا عملیات مرتبط با محصولات را ساده‌تر مدیریت کنید و دسترسی به سرویس‌های مختلف مانند AddNewCategoryService و GetCategoriesService را یکپارچه کنید. این کلاس با استفاده از الگوی Singleton اطمینان حاصل می‌کند که تنها یک نمونه از هر سرویس ایجاد می‌شود.
Test_Store => Application => Services => Products => Queries => GetCategories => IGetCategoriesService.cs بیایید کد GetCategoriesService را بررسی کنیم. این کد به منظور دریافت لیست دسته‌بندی‌ها طراحی شده است و شامل اینترفیس، کلاس سرویس، و چند DTO می‌شود. توضیحات کد: Interface IGetCategoriesService: این اینترفیس یک متد Execute را تعریف می‌کند که لیست دسته‌بندی‌ها را بر اساس ParentId برمی‌گرداند. این متد یک شیء ResultDto شامل لیستی از CategoriesDto را برمی‌گرداند. Class GetCategoriesService: کلاس GetCategoriesService پیاده‌سازی اینترفیس IGetCategoriesService است. Constructor: سازنده کلاس که یک شیء از نوع IDataBaseContext دریافت می‌کند. این شیء برای دسترسی به دیتابیس استفاده می‌شود. Method Execute: این متد لیست دسته‌بندی‌ها را بر اساس ParentId برمی‌گرداند. ابتدا دسته‌بندی‌ها را از دیتابیس دریافت می‌کند، سپس آن‌ها را به لیست CategoriesDto تبدیل می‌کند و نهایتاً نتیجه را برمی‌گرداند. DTO Classes: CategoriesDto: این کلاس نمایشی از یک دسته‌بندی شامل Id, Name, HasChild, و Parent است. ParentCategoryDto: این کلاس نمایشی از دسته‌بندی والد شامل Id و name است. نحوه عملکرد Execute Method: دریافت دسته‌بندی‌ها از دیتابیس: ابتدا دسته‌بندی‌ها را با استفاده از Include (برای بارگذاری دسته‌بندی والد و زیر دسته‌ها) و Where (برای فیلتر کردن بر اساس ParentId) از دیتابیس دریافت می‌کند. تبدیل به DTO: سپس دسته‌بندی‌ها را به لیست CategoriesDto تبدیل می‌کند. در هر CategoriesDto، اطلاعات مربوط به دسته‌بندی مانند Id, Name, Parent (در صورت وجود)، و HasChild (برای بررسی وجود زیر دسته‌ها) ذخیره می‌شود. بازگرداندن نتیجه: نهایتاً یک شیء ResultDto شامل لیست دسته‌بندی‌ها، وضعیت موفقیت‌آمیز بودن عملیات، و یک پیام برگردانده می‌شود. نتیجه‌گیری: این کد به شما کمک می‌کند تا به راحتی لیست دسته‌بندی‌ها را بر اساس ParentId دریافت کنید و آن‌ها را به صورت DTO بازگردانید. این روش به شما امکان می‌دهد تا داده‌ها را به شکل مورد نیاز در لایه‌های مختلف برنامه نمایش دهید.
Test_Store => Application => Services => Users => Commands => EditUser => IEditUserService.cs بیایید کد EditUserService را بررسی کنیم. این کد به منظور ویرایش اطلاعات کاربر طراحی شده است و شامل اینترفیس، کلاس سرویس، و یک DTO می‌شود. توضیحات کد: Interface IEditUserService: این اینترفیس یک متد Execute را تعریف می‌کند که درخواست ویرایش کاربر را می‌پذیرد و نتیجه عملیات را برمی‌گرداند. این متد یک شیء RequestEdituserDto به عنوان ورودی می‌پذیرد و یک شیء ResultDto به عنوان خروجی برمی‌گرداند. Class EditUserService: کلاس EditUserService پیاده‌سازی اینترفیس IEditUserService است. Constructor: سازنده کلاس که یک شیء از نوع IDataBaseContext دریافت می‌کند. این شیء برای دسترسی به دیتابیس استفاده می‌شود. Method Execute: این متد مسئول اجرای عملیات ویرایش کاربر است. ابتدا با استفاده از request.UserId کاربر مورد نظر را از دیتابیس پیدا می‌کند. اگر کاربر یافت نشد، یک پیام خطا برمی‌گرداند. اگر کاربر یافت شد، نام کامل کاربر (FullName) را به مقدار جدید تنظیم می‌کند و تغییرات را ذخیره می‌کند. در نهایت، یک پیام موفقیت‌آمیز برمی‌گرداند. DTO Classes: RequestEdituserDto: این کلاس نمایشی از درخواست ویرایش کاربر شامل UserId و Fullname است. نحوه عملکرد Execute Method: پیدا کردن کاربر: ابتدا کاربر مورد نظر را با استفاده از request.UserId از دیتابیس پیدا می‌کند. اگر کاربر یافت نشد، یک پیام خطا شامل IsSuccess برابر با false و Message با مقدار "کاربر یافت نشد" برمی‌گرداند. ویرایش اطلاعات کاربر: اگر کاربر یافت شد، مقدار FullName کاربر را به مقدار جدید از request.Fullname تنظیم می‌کند. تغییرات را در دیتابیس ذخیره می‌کند. در نهایت، یک پیام موفقیت‌آمیز شامل IsSuccess برابر با true و Message با مقدار "ویرایش کاربر انجام شد" برمی‌گرداند. نتیجه‌گیری: این کد به شما امکان می‌دهد تا اطلاعات کاربر را به راحتی ویرایش کنید و نتیجه عملیات را به صورت یک شیء ResultDto شامل وضعیت موفقیت و پیام مناسب برگردانید.
Test_Store => Application => Services => Users => Commands => RegisterUser => IRegisterUserService.cs بیایید با هم کد RegisterUserService را بررسی کنیم. این کد به منظور ثبت‌نام کاربران جدید طراحی شده است و شامل اینترفیس، کلاس سرویس، و چند DTO می‌شود. توضیحات کد: Interface IRegisterUserService: این اینترفیس یک متد Execute را تعریف می‌کند که درخواست ثبت‌نام کاربر را می‌پذیرد و نتیجه عملیات را برمی‌گرداند. این متد یک شیء RequestRegisterUserDto به عنوان ورودی می‌پذیرد و یک شیء ResultDto<ResultRegisterUserDto> به عنوان خروجی برمی‌گرداند. Class RegisterUserService: کلاس RegisterUserService پیاده‌سازی اینترفیس IRegisterUserService است. Constructor: سازنده کلاس که یک شیء از نوع IDataBaseContext دریافت می‌کند. این شیء برای دسترسی به دیتابیس استفاده می‌شود. Method Execute: این متد مسئول اجرای عملیات ثبت‌نام کاربر است. ابتدا بررسی می‌کند که آیا فیلدهای ضروری (ایمیل، نام، رمز عبور، تکرار رمز عبور) خالی یا نادرست هستند و در صورت لزوم پیام خطا برمی‌گرداند. سپس ایمیل کاربر را با استفاده از یک الگوی regex بررسی می‌کند تا از صحت آن اطمینان حاصل کند. رمز عبور کاربر را هش می‌کند و یک شیء User جدید ایجاد می‌کند. نقش‌های کاربر را به UserInRole ها تبدیل می‌کند و آن‌ها را به کاربر اضافه می‌کند. کاربر جدید را به دیتابیس اضافه می‌کند و تغییرات را ذخیره می‌کند. در نهایت، نتیجه موفقیت‌آمیز بودن عملیات را برمی‌گرداند. DTO Classes: RequestRegisterUserDto: این کلاس نمایشی از درخواست ثبت‌نام کاربر شامل FullName, Email, Password, RePassword, و لیستی از RolesInRegisterUserDto است. RolesInRegisterUserDto: این کلاس نمایشی از نقش‌های کاربر شامل Id است. ResultRegisterUserDto: این کلاس نمایشی از نتیجه ثبت‌نام کاربر شامل UserId است. نحوه عملکرد Execute Method: بررسی فیلدهای ورودی: ابتدا بررسی می‌کند که آیا فیلدهای ضروری خالی هستند یا خیر. اگر هر یک از فیلدها خالی باشد، یک پیام خطا شامل IsSuccess برابر با false و Message مناسب برمی‌گرداند. بررسی صحت ایمیل: با استفاده از regex، صحت ایمیل ورودی را بررسی می‌کند. اگر ایمیل نادرست باشد، یک پیام خطا برمی‌گرداند. هش کردن رمز عبور: رمز عبور ورودی را با استفاده از PasswordHasher هش می‌کند. ایجاد و ذخیره کاربر جدید: یک شیء User جدید ایجاد می‌کند و اطلاعات کاربر را تنظیم می‌کند. نقش‌های کاربر را به UserInRole ها تبدیل می‌کند و آن‌ها را به کاربر اضافه می‌کند. کاربر جدید را به دیتابیس اضافه می‌کند و تغییرات را ذخیره می‌کند. نتیجه موفقیت‌آمیز بودن عملیات را با UserId کاربر جدید برمی‌گرداند. مدیریت خطاها: در صورت بروز هرگونه خطا، یک پیام خطا برمی‌گرداند. نتیجه‌گیری: این کد به شما امکان می‌دهد تا کاربران جدید را به راحتی ثبت‌نام کنید و نتیجه عملیات را به صورت یک شیء ResultDto شامل وضعیت موفقیت و پیام مناسب برگردانید.
Test_Store => Application => Services => Users => Commands => RemoveUser => IRemoveUserService.cs بیایید کد IRemoveUserService را بررسی کنیم. این کد شامل یک اینترفیس است که متد حذف کاربر را تعریف می‌کند. توضیحات کد: Namespace: namespace Test_Store.Application.Services.Users.Commands.RemoveUser: نام‌فضا برای سازماندهی کدهای مرتبط با عملیات حذف کاربر. Interface IRemoveUserService: این اینترفیس یک متد Execute را تعریف می‌کند که مسئولیت حذف کاربر را بر عهده دارد. متد Execute: این متد یک پارامتر UserId از نوع long می‌پذیرد که شناسه کاربری است که باید حذف شود. این متد یک شیء ResultDto برمی‌گرداند که شامل وضعیت و پیام نتیجه عملیات حذف است. نتیجه‌گیری: این اینترفیس IRemoveUserService، یک قرارداد برای سرویس حذف کاربر تعریف می‌کند که شامل یک متد Execute است. این متد شناسه کاربر را به عنوان ورودی می‌پذیرد و نتیجه عملیات حذف را به صورت یک شیء ResultDto بازمی‌گرداند. برای پیاده‌سازی این اینترفیس، شما نیاز به یک کلاس دارید که این اینترفیس را پیاده‌سازی کند و عملیات حذف کاربر را انجام دهد.
Test_Store => Application => Services => Users => Commands => RemoveUser => RemoveUserService.cs بیایید کد RemoveUserService را بررسی کنیم. این کد به منظور حذف کاربران از سیستم طراحی شده است و شامل پیاده‌سازی اینترفیس IRemoveUserService است. توضیحات کد: Namespace: namespace Test_Store.Application.Services.Users.Commands.RemoveUser: نام‌فضا برای سازماندهی کدهای مرتبط با عملیات حذف کاربر. Class RemoveUserService: این کلاس پیاده‌سازی اینترفیس IRemoveUserService است. Constructor: سازنده کلاس که یک شیء از نوع IDataBaseContext دریافت می‌کند. این شیء برای دسترسی به دیتابیس استفاده می‌شود. Method Execute: این متد مسئول اجرای عملیات حذف کاربر است. متد Execute: این متد یک پارامتر UserId از نوع long می‌پذیرد که شناسه کاربری است که باید حذف شود. ابتدا با استفاده از UserId کاربر مورد نظر را از دیتابیس پیدا می‌کند. اگر کاربر یافت نشد، یک پیام خطا شامل IsSuccess برابر با false و Message با مقدار "کاربر یافت نشد" برمی‌گرداند. اگر کاربر یافت شد، زمان حذف (RemoveTime) و وضعیت حذف (IsRemoved) کاربر را به‌روز می‌کند. تغییرات را در دیتابیس ذخیره می‌کند. در نهایت، یک پیام موفقیت‌آمیز شامل IsSuccess برابر با true و Message با مقدار "کاربر با موفقیت حذف شد" برمی‌گرداند. نتیجه‌گیری: این کد به شما امکان می‌دهد تا کاربران را به راحتی از سیستم حذف کنید و نتیجه عملیات را به صورت یک شیء ResultDto شامل وضعیت موفقیت و پیام مناسب برگردانید.
Test_Store => Application => Services => Users => Commands => UserLogin => IUserLoginService.cs بیایید کد UserLoginService را بررسی کنیم. این کد به منظور احراز هویت کاربران و ورود آن‌ها به سیستم طراحی شده است و شامل اینترفیس، کلاس سرویس، و یک DTO می‌شود. توضیحات کد: Interface IUserLoginService: این اینترفیس یک متد Execute را تعریف می‌کند که نام کاربری (Username) و رمز عبور (Password) را می‌پذیرد و نتیجه عملیات را برمی‌گرداند. این متد یک شیء ResultDto<ResultUserloginDto> به عنوان خروجی برمی‌گرداند. Class UserLoginService: کلاس UserLoginService پیاده‌سازی اینترفیس IUserLoginService است. Constructor: سازنده کلاس که یک شیء از نوع IDataBaseContext دریافت می‌کند. این شیء برای دسترسی به دیتابیس استفاده می‌شود. Method Execute: این متد مسئول اجرای عملیات احراز هویت و ورود کاربر است. ابتدا بررسی می‌کند که آیا فیلدهای Username و Password خالی یا نادرست هستند و در صورت لزوم پیام خطا برمی‌گرداند. سپس کاربر را با استفاده از Username از دیتابیس پیدا می‌کند. اگر کاربر یافت نشد، یک پیام خطا برمی‌گرداند. اگر کاربر یافت شد، رمز عبور ورودی را با رمز عبور ذخیره شده مقایسه می‌کند. اگر رمز عبور نادرست باشد، یک پیام خطا برمی‌گرداند. اگر رمز عبور صحیح باشد، نقش‌های کاربر را به صورت رشته‌ای (Roles) در ResultUserloginDto ذخیره می‌کند و نتیجه موفقیت‌آمیز بودن عملیات را برمی‌گرداند. DTO Classes: ResultUserloginDto: این کلاس نمایشی از نتیجه احراز هویت کاربر شامل UserId, Roles, و Name است. نحوه عملکرد Execute Method: بررسی فیلدهای ورودی: ابتدا بررسی می‌کند که آیا فیلدهای Username و Password خالی هستند یا خیر. اگر هر یک از فیلدها خالی باشد، یک پیام خطا شامل IsSuccess برابر با false و Message مناسب برمی‌گرداند. پیدا کردن کاربر: سپس کاربر را با استفاده از Username از دیتابیس پیدا می‌کند. اگر کاربر یافت نشد، یک پیام خطا شامل IsSuccess برابر با false و Message با مقدار "کاربری با این ایمیل در سایت فروشگاه باگتو ثبت نام نکرده است" برمی‌گرداند. تأیید رمز عبور: رمز عبور ورودی را با رمز عبور ذخیره شده مقایسه می‌کند. اگر رمز عبور نادرست باشد، یک پیام خطا شامل IsSuccess برابر با false و Message با مقدار "رمز وارد شده اشتباه است!" برمی‌گرداند. ذخیره نقش‌ها و بازگرداندن نتیجه: نقش‌های کاربر را به صورت رشته‌ای (Roles) در ResultUserloginDto ذخیره می‌کند. نتیجه موفقیت‌آمیز بودن عملیات را با UserId, Roles, و Name کاربر برمی‌گرداند. نتیجه‌گیری: این کد به شما امکان می‌دهد تا کاربران را احراز هویت کنید و نتیجه عملیات ورود را به صورت یک شیء ResultDto شامل وضعیت موفقیت و پیام مناسب برگردانید. همچنین نقش‌های کاربر را به صورت رشته‌ای در ResultUserloginDto ذخیره می‌کند.
Test_Store => Application => Services => Users => Commands => UserSatusChange => IUserSatusChangeService.cs بیایید کد UserSatusChangeService را بررسی کنیم. این کد به منظور تغییر وضعیت فعالیت کاربران طراحی شده است و شامل اینترفیس، کلاس سرویس، و یک متد اصلی است. توضیحات کد: Namespace: namespace Test_Store.Application.Services.Users.Commands.UserSatusChange: نام‌فضا برای سازماندهی کدهای مرتبط با عملیات تغییر وضعیت کاربر. Interface IUserSatusChangeService: این اینترفیس یک متد Execute را تعریف می‌کند که شناسه کاربر (UserId) را می‌پذیرد و نتیجه عملیات را برمی‌گرداند. این متد یک شیء ResultDto به عنوان خروجی برمی‌گرداند. Class UserSatusChangeService: کلاس UserSatusChangeService پیاده‌سازی اینترفیس IUserSatusChangeService است. Constructor: سازنده کلاس که یک شیء از نوع IDataBaseContext دریافت می‌کند. این شیء برای دسترسی به دیتابیس استفاده می‌شود. Method Execute: این متد مسئول اجرای عملیات تغییر وضعیت کاربر است. متد Execute: این متد یک پارامتر UserId از نوع long می‌پذیرد که شناسه کاربری است که باید وضعیت آن تغییر کند. ابتدا با استفاده از UserId کاربر مورد نظر را از دیتابیس پیدا می‌کند. اگر کاربر یافت نشد، یک پیام خطا شامل IsSuccess برابر با false و Message با مقدار "کاربر یافت نشد" برمی‌گرداند. اگر کاربر یافت شد، وضعیت فعالیت کاربر (IsActive) را به مقدار مخالف فعلی تغییر می‌دهد. تغییرات را در دیتابیس ذخیره می‌کند. وضعیت جدید کاربر را بررسی کرده و بر اساس آن پیام مناسب را تنظیم می‌کند. در نهایت، یک پیام موفقیت‌آمیز شامل IsSuccess برابر با true و Message مناسب برمی‌گرداند. نتیجه‌گیری: این کد به شما امکان می‌دهد تا وضعیت فعالیت کاربران را به راحتی تغییر دهید و نتیجه عملیات را به صورت یک شیء ResultDto شامل وضعیت موفقیت و پیام مناسب برگردانید.
Test_Store => Domain => Entities => Commons => BaseEntity.cs بیایید کد BaseEntity را بررسی کنیم. این کد شامل دو کلاس انتزاعی است که به عنوان پایه برای دیگر کلاس‌های موجودیت‌ها در پروژه شما عمل می‌کنند. توضیحات کد: Namespace: namespace Test_Store.Domain.Entities.Commons: نام‌فضا برای سازماندهی کدهای مرتبط با کلاس‌های پایه و عمومی. Abstract Class BaseEntity<TKey>: این کلاس انتزاعی به منظور تعریف ویژگی‌های عمومی موجودیت‌ها ایجاد شده است و از نوع جنریک TKey استفاده می‌کند. Properties: public TKey Id { get; set; }: شناسه موجودیت از نوع جنریک TKey. public DateTime InsertTime { get; set; } = DateTime.Now;: زمان درج موجودیت، به طور پیش‌فرض زمان فعلی را تنظیم می‌کند. public DateTime? UpdateTime { get; set; }: زمان به‌روزرسانی موجودیت، مقدار نال‌پذیر. public bool IsRemoved { get; set; } = false;: وضعیت حذف موجودیت، به طور پیش‌فرض مقدار false دارد. public DateTime? RemoveTime { get; set; }: زمان حذف موجودیت، مقدار نال‌پذیر. Abstract Class BaseEntity: این کلاس انتزاعی از BaseEntity<long> ارث‌بری می‌کند و به عنوان یک کلاس پایه عمومی با شناسه از نوع long عمل می‌کند. Inheritance: public abstract class BaseEntity : BaseEntity<long>: ارث‌بری از کلاس جنریک BaseEntity با نوع long برای شناسه. نتیجه‌گیری: این کد به شما امکان می‌دهد تا کلاس‌های موجودیت‌های مختلف را به سادگی و با استفاده از کلاس پایه BaseEntity ایجاد کنید. کلاس BaseEntity ویژگی‌های عمومی مانند شناسه، زمان درج، زمان به‌روزرسانی، وضعیت حذف، و زمان حذف را تعریف می‌کند که می‌تواند در تمامی موجودیت‌ها استفاده شود. این ساختار به شما کمک می‌کند تا کد‌های خود را سازماندهی کرده و تکرار کد‌ها را کاهش دهید.
Test_Store => Domain => Entities => Commons => BaseEntityNotId.cs بیایید کد BaseEntityNotId را بررسی کنیم. این کد شامل یک کلاس انتزاعی (abstract class) است که برای تعریف ویژگی‌های عمومی موجودیت‌ها در پروژه شما استفاده می‌شود. توضیحات کد: Namespace: namespace Test_Store.Domain.Entities.Commons: نام‌فضا برای سازماندهی کدهای مرتبط با کلاس‌های پایه و عمومی. Abstract Class BaseEntityNotId: این کلاس انتزاعی به منظور تعریف ویژگی‌های عمومی موجودیت‌ها بدون شناسه (Id) ایجاد شده است. Properties: public DateTime InsertTime { get; set; } = DateTime.Now;: زمان درج موجودیت، به طور پیش‌فرض زمان فعلی را تنظیم می‌کند. این ویژگی زمانی که موجودیت برای اولین بار ایجاد می‌شود ثبت می‌گردد. public DateTime? UpdateTime { get; set; }: زمان به‌روزرسانی موجودیت، مقدار نال‌پذیر. این ویژگی زمانی که موجودیت به‌روزرسانی می‌شود ثبت می‌گردد. public bool IsRemoved { get; set; } = false;: وضعیت حذف موجودیت، به طور پیش‌فرض مقدار false دارد. این ویژگی نشان می‌دهد که آیا موجودیت حذف شده است یا خیر. public DateTime? RemoveTime { get; set; }: زمان حذف موجودیت، مقدار نال‌پذیر. این ویژگی زمانی که موجودیت حذف می‌شود ثبت می‌گردد. کاربرد کد: این کلاس BaseEntityNotId به شما امکان می‌دهد تا کلاس‌های موجودیت‌های مختلف را با استفاده از ویژگی‌های عمومی مانند زمان درج، زمان به‌روزرسانی، وضعیت حذف، و زمان حذف ایجاد کنید. این ساختار به شما کمک می‌کند تا کد‌های خود را سازماندهی کرده و تکرار کد‌ها را کاهش دهید. نتیجه‌گیری: این کد به شما کمک می‌کند تا کلاس‌های موجودیت‌های مختلف را به سادگی و با استفاده از کلاس پایه BaseEntityNotId ایجاد کنید. این کلاس ویژگی‌های عمومی را تعریف می‌کند که می‌توانند در تمامی موجودیت‌ها استفاده شوند، با این تفاوت که شناسه (Id) در این کلاس وجود ندارد.
Test_Store => Domain => Entities => Products => Category.cs بیایید کد Category را بررسی کنیم. این کد به منظور تعریف یک دسته‌بندی در فروشگاه شما طراحی شده است و از کلاس پایه BaseEntity ارث‌بری می‌کند. توضیحات کد: Namespace: namespace Test_Store.Domain.Entities.Products: نام‌فضا برای سازماندهی کدهای مرتبط با موجودیت‌های محصولات. Class Category: این کلاس نمایشی از یک دسته‌بندی در سیستم شماست و از کلاس پایه BaseEntity ارث‌بری می‌کند. Properties: public string Name { get; set; }: نام دسته‌بندی. public virtual Category ParentCategory { get; set; }: مرجع به دسته‌بندی والد، اگر وجود داشته باشد. این خاصیت به صورت virtual تعریف شده است که به Entity Framework اجازه می‌دهد تا از ویژگی‌های بارگذاری تنبل (lazy loading) استفاده کند. public long? ParentCategoryId { get; set; }: شناسه دسته‌بندی والد، اگر وجود داشته باشد. public virtual ICollection<Category> SubCategories { get; set; }: مجموعه‌ای از زیر دسته‌بندی‌ها. این خاصیت نیز به صورت virtual تعریف شده است که به Entity Framework اجازه می‌دهد تا از ویژگی‌های بارگذاری تنبل استفاده کند. نتیجه‌گیری: این کد به شما امکان می‌دهد تا دسته‌بندی‌ها و زیر دسته‌بندی‌های مرتبط را در سیستم خود تعریف کنید. کلاس Category شامل ویژگی‌هایی برای نام دسته‌بندی، دسته‌بندی والد، شناسه دسته‌بندی والد و مجموعه‌ای از زیر دسته‌بندی‌هاست. با استفاده از این ساختار، می‌توانید سلسله مراتب دسته‌بندی‌های محصولات خود را به راحتی مدیریت کنید.
Test_Store => Domain => Entities => Users => Role.cs بیایید کد Role را بررسی کنیم. این کد به منظور تعریف نقش‌ها در سیستم شما طراحی شده است و از کلاس پایه BaseEntity ارث‌بری می‌کند. توضیحات کد: Namespace: namespace Test_Store.Domain.Entities.Users: نام‌فضا برای سازماندهی کدهای مرتبط با موجودیت‌های کاربران. Class Role: این کلاس نمایشی از یک نقش در سیستم شماست و از کلاس پایه BaseEntity ارث‌بری می‌کند. Properties: public string Name { get; set; }: نام نقش. public ICollection<UserInRole> UserInRoles { get; set; }: مجموعه‌ای از UserInRole ها که ارتباط بین کاربران و نقش‌ها را نشان می‌دهد. این ویژگی به شما امکان می‌دهد تا چندین کاربر با چندین نقش را مدیریت کنید. نتیجه‌گیری: این کد به شما امکان می‌دهد تا نقش‌ها را در سیستم خود تعریف و مدیریت کنید. کلاس Role شامل ویژگی‌هایی برای نام نقش و مجموعه‌ای از UserInRole هاست که نشان‌دهنده ارتباط بین کاربران و نقش‌هاست. با استفاده از این ساختار، می‌توانید نقش‌های مختلف را به کاربران اختصاص دهید و به راحتی سیستم‌های دسترسی و مجوزها را مدیریت کنید.