首页 > 解决方案 > 无效操作异常。尝试保存更改时值未知

问题描述

我有活动并且有可以参加的用户。为了将事件与用户联系起来,我创建了一个新实体(表)作为链接参考(毫米)。

现在,我有点卡住了。在向事件添加新用户时,我收到异常:“尝试保存更改时,'BoardZoneEventCustomer.BoardZoneEventId' 的值是未知的。这是因为该属性也是关系中主体实体所在的外键的一部分未知。”

但在这个问题之前,我能够插入新行......现在它已经坏了。花了很多时间来解决它。

控制器:

[HttpPost("enroll")]
public async Task<IActionResult> Enroll([FromBody] EventCustomerCreationDto eventCustomer)
{
    var eventCustomerAdd = _mapper.Map<EventCustomerDto>(eventCustomer);
    var eventCustomerCreated = await _eventCustomerService.AddAsync(eventCustomerAdd);

    return new ObjectResult(eventCustomerCreated) { StatusCode = 201 };
}

服务(mm表):

public async Task<EventCustomerDto> AddAsync(EventCustomerDto eventCustomerDto)
        {
            var customer = await _customerRepository.GetByIdAsync(eventCustomerDto.CustomerId);
            var eventId = await _eventRepository.GetIdAsync(eventCustomerDto.BoardZoneEventId);


            var bzEvent = new BoardZoneEventCustomer
            {
                Customer = customer,
                BoardZoneEvent = eventId
            };

            if (await _eventCustomerRepository.IsDublicated(eventCustomerDto.CustomerId, eventCustomerDto.BoardZoneEventId))
            {
                throw new CustomerDublicateEnrollingException("Already registered.");
            }

            await _eventCustomerRepository.AddAsync(bzEvent);

            return _mapper.Map<EventCustomerDto>(bzEvent);
        }

忘记发布模型:

public class EventCustomerCreationDto
    {
        public int BoardZoneEventId { get; set; }
        public string CustomerId { get; set; }
    }

public class EventCustomerDto
    {
        public int BoardZoneEventId { get; set; }
        public BoardZoneEventDto BoardZoneEvent { get; set; }
        public string CustomerId { get; set; }
        public CustomerDto Customer { get; set; }
    }
 public class BoardZoneEventDto
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public DateTime StartDate { get; set; }
        public DateTime EndDate { get; set; }
        public string Country { get; set; }
        public string City { get; set; }
        public decimal Price { get; set; }
        public int? MaxParticipantsNumber { get; set; }
        public int AlreadyRegisteredParticipants { get; set; }
        public string Description { get; set; }
        public int FileEntityId { get; set; }
        public BoardZoneEventType EventType { get; set; }
    }

标签: asp.net-coreasp.net-web-apientity-framework-core

解决方案


尝试这个

public async Task<EventCustomerDto> AddAsync(EventCustomerDto eventCustomerDto)
{

// I  moved this validation at the top where it makes sense

if (await _eventCustomerRepository.IsDublicated(eventCustomerDto.CustomerId, eventCustomerDto.BoardZoneEventId))
 {
  throw new CustomerDublicateEnrollingException("Already registered.");
 }

// ----- what do you need it for ????

            var customer = await _customerRepository.GetByIdAsync(eventCustomerDto.CustomerId);
            var eventId = await _eventRepository.GetIdAsync(eventCustomerDto.BoardZoneEventId);

//--------------


            var bzEvent = new BoardZoneEventCustomer
            {
                CustomerId = eventCustomerDto.CustomerId,
                BoardZoneEventId = eventCustomerDto.BoardZoneEventId
            };


            await _eventCustomerRepository.AddAsync(bzEvent);
            return  eventCustomerDto;


           //  why do you need to map it?
           return _mapper.Map<EventCustomerDto>(bzEvent);
        }

推荐阅读