EF核心未正确更新外键项

时间:2020-04-11 19:16:20

标签: asp.net-core ef-core-3.0

我正在尝试更新user及其对应的items,但是我的行为很奇怪。更具体地说,user正在更新,但是items被添加到items表中,并且该表中已经存在的先前items具有{{ UserId中的1}},以及新的null具有更新的items

我在REST调用中尝试了各种操作,例如包括UserIdUserId,但这会为ItemId产生System.InvalidOperationException。但是,向表中添加items及其对应的user很好。

items

其他电话

public HttpStatusCode UpdateUsersAndItems(User user)
{
    if (ModelState.IsValid)
    {
        using (MyContext myContext = _myContext as MyContext)
        {
            User updateUser = myContext?.Users?.Include(i => i.Items).FirstOrDefault(u => u != null && u.UserName == user.UserName);

            if(updateUser != null)
            {
                updateUser.UserName = user.UserName;
                updateUser.Dob = user.Dob;
                updateUser.Location = user.Location;
                updateUser.Items = user.Items;

                myContext?.Users?.Update(updateUser);

                int changes = myContext.SaveChanges();

                if (changes > 0)
                {
                    return HttpStatusCode.Created;
                }
            }
        }
    }

    return HttpStatusCode.NotModified;
}

namespace TestWebApplication.Database
{
    public class User
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int UserId { get; set; }
        public string UserName { get; set; }
        public string Dob { get; set; }
        public string Location { get; set; }

        public ICollection<Items> Items { get; set; }
    }
}


namespace TestWebApplication.Database
{
    public class Items
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int ItemId { get; set; }
        public string Item { get; set; }
        public string Category { get; set; }
        public string Type { get; set; }

        public int? UserId { get; set; }

        [ForeignKey("UserId")]
        public virtual User User { get; set; }
    }
}

1 个答案:

答案 0 :(得分:1)

您必须仔细检查每个项目,然后更改其属性。

类似这样的东西。

Comment

我看不到您如何唯一标识商品,但没有将主键暴露给前端(网络)