Оператор обновления конфликтует с FK при обновлении в репозитории generi c. net core web api - PullRequest
1 голос
/ 09 июля 2020

Обычно при вызове метода Put из контроллера и попытке обновить свойства я получаю конфликт от Db.

введите описание изображения здесь

Использование шаблона репозитория с единицей работы.

Модель автомобиля -

public class Car : BaseModel 
    {
        public Guid CategoryId { get; set; }
        public Category Category { get; set; }
        public Guid ManufacturerId { get; set; }
        public Manufacturer Manufacturer { get; set; }
        public Guid ManufacturerModelId { get; set; }
        public ManufacturerModel ManufacturerModel { get; set; }
        public DateTime ManufactureDate { get; set; }
        public string Engine { get; set; }
        public Guid FuelTypeId { get; set; }
        public FuelType FuelType { get; set; }
        public Guid FrameTypeId { get; set; }
        public FrameType FrameType { get; set; }
        public Guid ColorId { get; set; }
        public Color Color { get; set; }
        public Guid TransmissionId { get; set; }
        public Transmission Transmission { get; set; }
        public Guid DefectsId { get; set; }
        public Defects Defects { get; set; }
        public Guid SteeringWheelPosId { get; set; }
        public SteeringWheelPos SteeringWheelPos { get; set; }
        public Doors Doors { get; set; }
        public int Seats { get; set; }
        public DateTime VehicleInspection { get; set; }
        public string Description { get; set; }
        public decimal Price { get; set; }
    }

Класс BaseModel

public class BaseModel : IBaseModel
    {

        public BaseModel()
        {
            Id = Guid.NewGuid();
            CreatedOn = DateTime.Now;
        }
        [Key]
        public Guid Id { get; set; }
        public DateTime CreatedOn { get; set; }
    }

метод put (im используя cqrs здесь, а контроллер уже передает carDto методу)

 public async Task<Unit> Handle(Command request, CancellationToken cancellationToken)
            {
                if(request.obj == null)
                {
                    throw new StatusCodeException(HttpStatusCode.BadRequest, "Object is empty");
                }
                var DbEntry = uow.carRepository.GetById(request.Id);
                if (DbEntry == null)
                {
                    throw new StatusCodeException(HttpStatusCode.NotFound, "was not found in database", request.Id);
                }
                request.obj.Id = request.Id;
                var s = uow.Mapper.Map(request.obj, DbEntry);
                uow.carRepository.Update(s);
                uow.Commit();
                return Unit.Value;
            }

//Update method in generic repository class 


public void Update(T obj)
        {        
            context.Attach(obj);
            context.Entry(obj).State = EntityState.Modified;
        }

Я не могу найти, где я делаю что-то не так. Проверено точками останова, данные везде верны. получение ошибки при вызове uow для фиксации изменений. Спасибо. С нетерпением жду.

1 Ответ

0 голосов
/ 21 июля 2020

Причина, по которой возникает эта ошибка, заключается в том, что ваш внешний ключ DefectId в 'Car', вероятно, имеет значение 0.

Когда ядро ​​entity framework встречает значение 0 для внешнего ключа, оно выдает ошибку такого рода. , потому что он не может вставить внешнее значение 0, которое является первичным ключом некоторого объекта. Очевидно, что первичные ключи не могут иметь значение 0.

Надеюсь, это ответ на ваш вопрос.

...