Ошибка, поскольку другой объект того же типа уже имеет то же значение первичного ключа, что и - PullRequest
0 голосов
/ 11 мая 2018

Как исправить ошибку ..

При обновлении записи показать эту ошибку:

Показать ошибку: {"Присоединение сущности типа 'DomainClass.WorkshopReport 'не выполнен, так как другой объект того же типа уже имеет такое же значение первичного ключа. Это может произойти при использовании метода Attach или установке состояния объекта в значение «Не изменен» или «Изменен», если какие-либо объекты в графе имеютконфликтующие значения ключей. Это может быть связано с тем, что некоторые объекты являются новыми и еще не получили сгенерированные базой данных значения ключей. В этом случае используйте метод «Добавить» или состояние «Добавленный» для отслеживания графика, а затем установите состояние не-новые сущности в «Неизмененные» или «Измененные» в зависимости от ситуации. "}

Класс домена:

namespace DomainClass
{
    public class WorkshopReport
    {
        public int Id { set; get; }
        public int UserId { set; get; }
        public int? ManagerIdConfirm { set; get; }
        public bool? ManagerConfirmState { set; get; }
        public DateTime? ManagerConfirmDateTime { set; get; }
        public int? SuperviderIdConfirm { set; get; }
        public bool? SuperviderConfirmState { set; get; }
        public DateTime? SuperviderConfirmDateTime { set; get; }
        public string ReportNumber { set; get; }
        public string Shift { set; get; }
        public string ShiftWork { set; get; }
        public DateTime ShiftDate { set; get; }
        public string ShiftPersennel { set; get; }
        public string Type { set; get; }
        public DateTime SubmitDateTime { set; get; }
    }
}

Репозиторий интерфейса:

namespace InterfaceRepository
{
    public interface IWorkshopReportRepository
    {
        IQueryable<WorkshopReport> Get();
        bool Save();
        bool Add(WorkshopReport newValue);
        bool Delete(WorkshopReport deleted);
        bool Edit(WorkshopReport updated);
        IQueryable<WorkshopReport> FindById(int Id);
        IQueryable<WorkshopReport> Search(string ReportNumber);
    }
}

Уровень хранилища:

 namespace RepositoryLayer
{
    public class WorkshopReportRepository:IWorkshopReportRepository
    {
        public CMSDataContext _ctx;
        public WorkshopReportRepository(CMSDataContext ctx)
        {
            _ctx = ctx;
        }
        public IQueryable<WorkshopReport> Get()
        {
            return _ctx.WorkshopReports;
        }

        public bool Save()
        {
            try
            {
                return _ctx.SaveChanges() > 0;
            }
            catch (Exception ex)
            {
                // TODO log this error
                return false;
            }
        }
        public bool Add(WorkshopReport newValue)
        {
            try
            {
                _ctx.WorkshopReports.Add(newValue);
                return true;
            }
            catch (Exception ex)
            {
                // TODO log this error
                return false;
            }
        }

        public bool Delete(WorkshopReport deleted)
        {

            try
            {
                _ctx.WorkshopReports.Remove(deleted);
                return true;
            }
            catch (Exception ex)
            {
                // TODO log this error
                return false;
            }
        }


        public bool Edit(WorkshopReport updated)
        {
            try
            {
                _ctx.Entry(updated).State = System.Data.Entity.EntityState.Modified;
                return true;
            }
            catch (Exception ex)
            {
                // TODO log this error
                return false;
            }
        }

        public IQueryable<WorkshopReport> Search(string Value)
        {
            return _ctx.WorkshopReports.Where(i => i.ReportNumber.Contains(Value));
        }

        public IQueryable<WorkshopReport> FindById(int Id)
        {
            return _ctx.WorkshopReports.Where(i => i.Id == Id);
        }
    }
}

Контроллер мастерской:

public ActionResult Edit(WorkshopReport value, FormCollection formvalue)
        {
            try
            {

                    value.ShiftDate =
                        _calenderRepository.ConvertPersianToEnglishFormat(formvalue["ShiftDate"].ToString());
                    value.SubmitDateTime=DateTime.Now;
                    value.Type = internalType;
                    value.UserId= _userRepository.FindByEmail(User.Identity.Name).Id;
                    if (_workshopReportRepository.Edit(value))
                    {
                        _workshopReportRepository.Save();
                        TempData["Success"] = "Updated";
                    }

            }
            catch (Exception)
            {
                TempData["Error"] = "Try again...";
            }
            return RedirectToAction("Index", "WorkshopReport", new { type = internalType });

Показать ошибку на уровне репозитория: image of this error

1 Ответ

0 голосов
/ 19 июня 2018

Проблема была решена таким образом.

public bool Edit(WorkshopReport updated)
        {
            try
            {
                var local = _ctx.Set<WorkshopReport>()
                    .Local
                    .FirstOrDefault(f => f.Id == updated.Id);
                if (local != null)
                {
                    _ctx.Entry(local).State = EntityState.Detached;
                }
                _ctx.Entry(updated).State = System.Data.Entity.EntityState.Modified;
                return true;
            }
            catch (Exception ex)
            {
                // TODO log this error
                return false;
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...