EF Core 未正确更新外键项
EF Core Not Updating Foreign Key Items Correctly
我正在尝试更新 user
及其对应的 items
,但出现了奇怪的行为。更具体地说,user
正在更新,但是 items
被添加到 items
table 和之前的 items
中,它们已经存在于 table,有 UserId
的 null
,新的 items
有更新的 UserId
。
我尝试了各种方法,例如在我的 REST 调用中包含 UserId
和 ItemId
,但这导致 items
的 System.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;
}
}
}
我看不到你如何唯一标识你的项目,但不要将主键暴露给前端(网络)
我正在尝试更新 user
及其对应的 items
,但出现了奇怪的行为。更具体地说,user
正在更新,但是 items
被添加到 items
table 和之前的 items
中,它们已经存在于 table,有 UserId
的 null
,新的 items
有更新的 UserId
。
我尝试了各种方法,例如在我的 REST 调用中包含 UserId
和 ItemId
,但这导致 items
的 System.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;
}
}
}
我看不到你如何唯一标识你的项目,但不要将主键暴露给前端(网络)