无法将元素添加到模型类的ICollection或更新数据库中的外键

时间:2019-02-24 18:55:03

标签: c# asp.net asp.net-web-api

因此,我为我的Web API创建了两个模型类。买家和公寓类。买家可以拥有多个公寓。因此,我的模型类如下:

public class Apartment
    {
        [Key]
        public int ID { get; set; }
        public string Title { get; set; }
        public int NbofRooms { get; set; }
        public int Price { get; set; }
        public string Address { get; set; }
    }

public class Buyer
    {
        [Key]
        public int ID { get; set; }
        public string FullName { get; set; }
        public int Credit { get; set; }
        public ICollection<Apartment> apartments { get; set; }
    }

因此,该项目在数据库中创建了两个表,其中Apartments表包含BuyerID。因此,我不知道是否要在给定公寓ID和买主ID的情况下创建购买功能,如何更改数据库中的买主ID。 这是我在“买方控制器”中尝试的方法:

[HttpPut("{id}/{ApartmentID}")]
        public async Task<IActionResult> PutBuyerApartment([FromRoute] int id, [FromRoute] int apartID, [FromBody] Buyer buyer)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            if (id != buyer.ID)
            {
                return BadRequest();
            }

            var Apartments = await _context.Apartments.SingleOrDefaultAsync(m => m.ID == apartID);

            _context.Entry(Apartments).State = EntityState.Modified;
            buyer.apartments.Add(Apartments);
            _context.Entry(buyer).State = EntityState.Modified;

            try
            {
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!BuyerExists(id))
                {
                    return NotFound();
                }
                else
                {
                    throw;
                }
            }

            return NoContent();
        }

我应该如何更改它以便它起作用或还有其他方法? 谢谢

1 个答案:

答案 0 :(得分:0)

更好的方法是告诉EF他们在您的模型公寓中的直接关系

public class Apartment
    {
        [Key]
        public int ID { get; set; }
        public string Title { get; set; }
        public int NbofRooms { get; set; }
        public int Price { get; set; }
        public string Address { get; set; }
        public int BuyerId { get; set; } //Make it nullable if an aparment may not have a buyer at some point

        public Buyer Buyer { get; set; }
    }

此约定与数据库中的影响相同,但是通过更改“公寓购买者ID”,它将反映在您的购买者公寓列表中,并增加了可以直接通过公寓访问买方信息的好处。