EF Core 未正确更新外键项

EF Core Not Updating Foreign Key Items Correctly

我正在尝试更新 user 及其对应的 items,但出现了奇怪的行为。更具体地说,user 正在更新,但是 items 被添加到 items table 和之前的 items 中,它们已经存在于 table,有 UserIdnull,新的 items 有更新的 UserId

我尝试了各种方法,例如在我的 REST 调用中包含 UserIdItemId,但这导致 itemsSystem.InvalidOperationException。但是,将 user 及其对应的 items 添加到 table 中可以正常工作。

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

休息电话

{
    "username": "xxx",
    "dob": "xxx",
    "location": "xxx",
    "items":[{
        "item": "xxx",
        "category": "xxx",
        "type": "xxx"
        },
        {
        "item": "xxx",
        "category": "xxx",
        "type": "xxx"
        },
        {
        "item": "xxx",
        "category": "xxx",
        "type": "xxx"
        }]
}

您必须遍历每个项目,并更改其属性。

像这样。

       using (MyContext myContext = _myContext as MyContext)
        {
            User updateUser = myContext?.Users?.Include(i => i.Items).FirstOrDefault(u => u != null && u.Id == user.Id);

            if(updateUser != null)
            {
                updateUser.UserName = user.UserName;
                updateUser.Dob = user.Dob;
                updateUser.Location = user.Location;
                foreach( var userItem in user.Items )
                {
                   var updateItem = updateUser.Items.SingleOrDefault( i => i.Id == userItem.Id );
                   if( updateItem == null )
                   {
                     updateItem = new Items {
                       Type = userItem.Type,
                       Category = userItem.Category
                     };
                     updateUser.Items.Add(updateItem);
                   }
                   else
                   {
                     updateItem.Type = userItem.Type;
                     updateItem.Category = userItem.Category;
                   }
                }


                int changes = myContext.SaveChanges();

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

我看不到你如何唯一标识你的项目,但不要将主键暴露给前端(网络)