【问题标题】:InvalidOperationException. The value is unknown when attempting to save changes无效操作异常。尝试保存更改时值未知
【发布时间】:2021-09-10 20:53:39
【问题描述】:

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

现在,我有点卡住了。在向事件添加新用户时,我收到异常:“尝试保存更改时,'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 };
}

服务(用于 m-m 表):

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; }
    }

【问题讨论】:

  • 你能发布 BoardZoneEventCustomer 类吗

标签: asp.net-core asp.net-web-api entity-framework-core


【解决方案1】:

试试这个

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);
        }

【讨论】:

    猜你喜欢
    • 2021-10-01
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 2016-07-17
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多