روش آپدیت چند رکورد در یک اکشن با استفاده از حلقه for و unit of work
با سلام من میخواهم با آپدیت یک رکود در جدولی اطلاعات فیلد های دیگری هم آپدیت شود و دستورات من به این شکل است برای آپدیت رکوردهای بعدی و همچین از مدل unit of work برای اتصال به دیتا بیس و آپدیت استفاده می کنم اما با خطایی بصورت زیر مواجه میشوم.
خطا:
The instance of entity type cannot be tracked because another instance of this type with the same key is already being tracked

پاسخ هوش مصنوعی
این خطا معمولاً به این علت رخ می دهد که شما سعی دارید رکوردی را به حالت پیگیری (tracking) از Entity Framework اضافه کنید در حالی که یک نمونه دیگر از همان نوع موجود است که در حال حاضر پیگیری می شود. برای حل این مشکل، شما می توانید از روش زیر برای بروزرسانی رکوردها استفاده کنید:
فرض کنید که شما یک مدل به نام MyEntity دارید و یک UnitOfWork تعریف شده است. می توانید حلقه for خود را به این شکل بنویسید:
foreach (var item in itemsToUpdate)
{
var existingEntity = unitOfWork.MyEntities.Find(item.Id);
if (existingEntity != null)
{
existingEntity.Property1 = item.Property1;
existingEntity.Property2 = item.Property2;
// به روز رسانی سایر خواص لازم
}
}
unitOfWork.SaveChanges();
به این ترتیب شما رکوردهای موجود را با استفاده از Find پیدا کرده و به روزرسانی می کنید بدون اینکه نمونه های تکراری ایجاد کنید. برای اطمینان از عدم بروز خطای پیگیری، بهتر است همیشه از یک نمونه موجود استفاده کنید.
وقتی می خواید یک رکورد رو آپدیت کنید باید ID یا همون کلید اصلی اون رکورد هم داشته باشید. الان در این تصویری که شما ارسال کردید در حلقه آیا کلید اصلی جدول Passandaz وجود داره؟
نکته بعدی اینکه وقتی می خواید چندین رکورد رو آپدیت کنید بهتره که از این روش استفاده نکنید و یک کوئری برای این کار بنویسید
public void Update(int LabResponseDetailsID, byte LabResponseAdaptation, string LabResponseResult, string labresponsedescription)
{
var result = (from lr in _context.LabResponseDetails_Tbl where lr.LabResponseDetailsID == LabResponseDetailsID select lr);
var current = result.FirstOrDefault();
if (result.Count() != 0)
{
current.LabResponseAdaptation = LabResponseAdaptation;
current.LabResponseResult = LabResponseResult;
current.LabResponseDescription = labresponsedescription;
_context.LabResponseDetails_Tbl.Attach(current);
_context.Entry(current).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
}
}
در کدهای بالا یک متد برای آپدیت اطلاعات نوشته شده. که چندین فیلد درون اون آپدیت میشه.
شما کافیه در یک interface این متد رو تعریف کنید و درون کنترلر ازش استفاده کنید
public interface IRefferalToLaboratoryRepository
{
void UpdateLabResponseDetails(int LabResponseDetailsID, byte LabResponseAdaptation,string LabResponseResult, string labresponsedescription);
}
حالا توی حلقه for میتونید فقط همین متد رو صدا بزنید
for (int i = 0; i < length; i++)
{
_interface.Update(LabResponseDetailsID,LabResponseAdaptation,LabResponseResult, labresponsedescription);
}
_context.save()
ضمنا دستور savechange هم بهتره خارج از حلقه قرار بدید تا تعداد درخواست های سمت دیتابیس بیخود زیاد نشه.
- کار نکردن navBar و sideBar در پروژه Asp.net core
- خطا موقع استفاده از Api در سی شارپ
- آموزش استفاده از پلاگین گردونه شانس در Asp.net core به همراه سورس
- نمایش متن به صورت فرمت شده در CkEditor
- آموزش استفاده از SignalR در Asp.net Core با مثال عملی
- ادغام چند گزارش استیمول سافت بصورت پی دی اف در یک فایل
- نحوه تغییر استایل کامپوننت select2 چگونه است ؟
- چگونه امنیت پروژه را در Asp.net Core افزایش دهیم ؟
- ارسال پارامتر در دستور window.open جی کویری
- ارسال پارامتر از طریق جاوااسکریپت با کلیک روی تگ a
- کار با CkEditor با قابلیت آپلود عکس
- خطا در ایجاد migration در Asp.net core
- تفاوت های Asp.net core و Asp.net mvc چیه؟
- دلیل اسپم شدن ایمیل های ارسالی از سرور
- نحوه لایه بندی پروژه Core و اضافه کردن به IIS
- ارسال ایمیل در Asp.net core
- آیا میشه در mvc core از کامپونت استفاده کرد
- آپلود فایل در Asp.net core چگونه است؟
- حذف کامل یک رکورد در جدول ریلیشن شده
- اشکال در آپلود فایل ویدیو در mvc core 2