دسته بندی ها
20:17 1399/01/10

روش آپدیت چند رکورد در یک اکشن با استفاده از حلقه for و unit of work

مشخصات سوال کننده :
کاربر : Soltani     امتیاز کاربر : 3     رتبه کاربر : 137
دسته بندی : Asp.net Core

به این سوال امتیاز بدهید    1
تعداد بازدید این سوال : 2544
هوش مصنوعی

پاسخ هوش مصنوعی

این خطا معمولاً به این علت رخ می دهد که شما سعی دارید رکوردی را به حالت پیگیری (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 پیدا کرده و به روزرسانی می کنید بدون اینکه نمونه های تکراری ایجاد کنید. برای اطمینان از عدم بروز خطای پیگیری، بهتر است همیشه از یک نمونه موجود استفاده کنید.

به این پاسخ امتیاز بدهید    0
امتیاز: - رتبه: -
پاسخ دهنده : fateme 21:41 1399/01/10

وقتی می خواید یک رکورد رو آپدیت کنید باید 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 هم بهتره خارج از حلقه قرار بدید تا تعداد درخواست های سمت دیتابیس بیخود زیاد نشه.

به این پاسخ امتیاز بدهید    1
امتیاز: 1635 رتبه: 2
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود