
سرویسهای حرفهای برای روابط یک به چند در EF Core
در آموزش، سرویسهای حرفهای برای روابط یک به چند در EF Core یاد میگیریم چگونه یک Service Layer برای مدیریت روابط یک به چند ایجاد کنیم. در قسمت قبلی مدلهای Entity را طراحی کردیم. و در این قسمت یک Service Interface و Implementation برای عملیات CRUD پیادهسازی خواهیم کرد. و در قسمت بعدی نحوه استفاده از این سرویس را بررسی خواهیم کرد تا دسترسی به دادههای مرتبط تسهیل شود.
در بسیاری از سیستمهای مدیریت اطلاعات، نیاز به ثبت و نگهداری اطلاعات تماس کاربران یا دانشجویان وجود دارد. در این مقاله، یک سرویس مدیریت تلفن دانشجویان را که با ASP.NET Core و Entity Framework Core پیادهسازی شده، بررسی خواهیم کرد. این سرویس یک رابطه یک به چند (One-to-Many) را بین دانشجویان (Student) و تلفنهای آنها (Phone) مدیریت میکند.
ساخت اینترفیس سرویس تلفن
این اینترفیس مجموعهای از متدهای مورد نیاز برای مدیریت تلفنهای دانشجویان را تعریف میکند.
public interface IPhoneService
{
public Task<PhoneViewModel> GetPhoneByIdAsync(int id);
public Task<List<PhoneViewModel>> GetPhonesByStudentId(int studentId);
public Task<bool> CreatePhoneAsync(PhoneViewModel phoneVm);
public Task<int> DeletePhoneAsync(int id);
public IEnumerable<SelectListItem> GetPhoneType();
}- یک تلفن را بر اساس شناسه (ID) دریافت میکند : GetPhoneByIdAsync(int id)
- تمام تلفنهای مربوط به یک دانشجو را برمیگرداند : GetPhonesByStudentId(int studentId)
- یک تلفن جدید را در پایگاه داده اضافه میکند : CreatePhoneAsync(PhoneViewModel phoneVm)
- یک تلفن خاص را حذف میکند : DeletePhoneAsync(int id)
پیادهسازی PhoneService.cs
این کلاس، اینترفیس IPhoneService را پیادهسازی کرده و عملیات CRUD را مدیریت میکند.
دریافت یک تلفن بر اساس Id
/// <summary>
/// دریافت اطلاعات تلفن بر اساس شناسه
/// </summary>
/// <param name="id">شناسه تلفن</param>
/// <returns>مدل نمایشی تلفن</returns>
public async Task<PhoneViewModel> GetPhoneByIdAsync(int id)
{
var Phone = await _context.phones
.AsNoTracking()
.ProjectTo<PhoneViewModel>(_mapper.ConfigurationProvider)
.FirstOrDefaultAsync(x => x.Id == id);
if (Phone == null)
throw new KeyNotFoundException("Phone not found");
return Phone;
}دریافت تمام تلفنهای یک دانشجو
/// <summary>
/// دریافت لیست تلفنها بر اساس شناسه دانشجو
/// </summary>
/// <param name="studentId">شناسه دانشجو</param>
/// <returns>لیست مدل نمایشی تلفنها</returns>
public async Task<List<PhoneViewModel>> GetPhonesByStudentId(int studentId)
{
if (!await _context.students.AnyAsync(x => x.Id == studentId))
throw new KeyNotFoundException("Student not found");
var Phones = await _context.phones
.ProjectTo<PhoneViewModel>(_mapper.ConfigurationProvider)
.AsNoTracking()
.Where(x => x.StudentId == studentId)
.ToListAsync();
return Phones ?? new List<PhoneViewModel>();
}اضافه کردن یک تلفن جدید
/// <summary>
/// ایجاد تلفن جدید
/// </summary>
/// <param name="phoneVm">مدل نمایشی تلفن</param>
/// <returns>وضعیت موفقیت عملیات</returns>
public async Task<bool> CreatePhoneAsync(PhoneViewModel phoneVm)
{
if (phoneVm == null || phoneVm.Id != 0)
throw new ArgumentNullException("PhoneViewModel cannot be null");
if (!await _context.students.AnyAsync(x => x.Id == phoneVm.StudentId))
throw new KeyNotFoundException("Student not found");
var Phone = _mapper.Map<Phone>(phoneVm);
_context.Add(Phone);
await _context.SaveChangesAsync();
return true;
}حذف یک تلفن خاص
/// <summary>
/// حذف تلفن بر اساس شناسه
/// </summary>
/// <param name="id">شناسه تلفن</param>
/// <returns>شناسه دانشجو</returns>
public async Task<int> DeletePhoneAsync(int id)
{
var Phone = await _context.phones.FindAsync(id);
if (Phone == null)
throw new KeyNotFoundException("Phone not found");
_context.phones.Remove(Phone);
await _context.SaveChangesAsync();
return Phone.StudentId;
}






























مثل همیشه بسیار عالی و روان، واقعا خسته نباشید
مرسی دوست عزیز ❤️❤️❤️
سلام
دم شما گرم
شما به من یاد دادید که همیشه دوره های پولی بهتر از دوره های رایگان نیستند
خدا شما رو حفظ کنه.