در این بخش از آموزش AutoMapper، میخواهیم به حل مشکل Update در AutoMapper بپردازیم. هنگام استفاده از AutoMapper برای بهروزرسانی موجودیتها در EF Core، ممکن است با مشکلاتی مواجه شوید، چرا که EF Core به صورت پیشفرض تغییرات اعمال شده روی موجودیتها را شناسایی نمیکند. برای حل این مشکل میتوانید مراحل زیر را دنبال کنید:
var ManagerM = _mapper.Map<Manager>(ManagerVm);
متد Attach : وقتی از Attach استفاده میکنید، EF Core شروع به ردیابی موجودیت میکند اما فرض میکند که این موجودیت تغییر نکرده است. به همین دلیل وضعیت موجودیت به صورت پیشفرض Unchanged تنظیم میشود. اگر بخواهید ویژگیهای خاصی را به عنوان تغییریافته مشخص کنید، باید این کار را به صورت دستی انجام دهید.
استفاده از Attach فقط وضعیت موجودیت را به Unchanged تغییر میدهد و تغییرات روی ویژگیها را ردیابی نمیکند. این متد برای مواقعی مناسب است که نیاز دارید به طور دقیق کنترل کنید کدام ویژگیها بهروزرسانی شوند، بدون اینکه کل موجودیت تغییریافته فرض شود.
متد Entry : یکی از امکانات مهم کلاس DbContext است که برای دسترسی و مدیریت وضعیت یک موجودیت (Entity) در کانتکست داده استفاده میشود.
متد Property : میتوانید به وپراپرتی ها دسترسی پیدا کنید و وضعیت آنها را تغییر دهید. مثلاً، اگر بخواهید یک وپراپرتی را به عنوان تغییریافته علامتگذاری کنیم.
_context.Attach(ManagerM);
_context.Entry(ManagerM).Property(a => a.Name).IsModified = true;
_context.Entry(ManagerM).Property(a => a.Family).IsModified = true;
_context.Entry(ManagerM).Property(a => a.Gender).IsModified = true;
_context.Entry(ManagerM).Property(a => a.Age).IsModified = true;
await _context.SaveChangesAsync();
این روش باعث میشود که EF Core فقط ویژگیهای مشخصشده را بهروزرسانی کند و از ایجاد درخواستهای اضافی برای ویژگیهایی که تغییر نکردهاند، جلوگیری شود. همچنین، این فرآیند برای سناریوهایی که فقط بخشی از ویژگیها نیاز به بهروزرسانی دارند، بسیار کارآمد است.