در آموزش، سرویسهای حرفهای برای روابط یک به چند در 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();
}
این کلاس، اینترفیس IPhoneService را پیادهسازی کرده و عملیات CRUD را مدیریت میکند.
/// <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;
}
مثل همیشه بسیار عالی و روان، واقعا خسته نباشید