我在使用实体框架保存对数据库的更改时遇到问题。我用的是三张桌子;AspNetUsers、tblCountry和tblCountry_AspNetUsers。
tblCountry_AspNetUsers由两列组成;UserId和CountryId,这在tblCountry和AspNetUsers之间创建了一对多关系。
目前,我想做的是更改特定用户的国家/地区,但实体框架不允许我访问tblCountry_AspNetUsers数据库,而是在tblCountry上创建一个AspNetUsers的ICollection。我可以直接在AspNetUser上分配Id,但我现在还不想开始从标识表中添加/删除列,因为我首先使用数据库,我听说这可能会导致问题。
无论如何,我可以从ICollection中删除,并将这些更改保存到数据库中,但当我尝试将同一用户添加到不同的国家/地区时,它不会正确保存到数据库,但我可以在调试时在上下文对象中找到该用户。
我曾尝试将entitystate附加并更改为added和modified,但当我尝试这样做时,它会脱离方法,不会更新数据库。(基本上,当我尝试连接时它会冻结)
编辑用户的代码如下所示:
(注意,UserManager处理身份用户模型ApplicationUser,在这方面与AspNetUsers不同)
(此外,tblCountry.AspNetUsers是指分配给特定国家/地区的用户的集合)
...
var aspuser = new AspNetUsers();
using (DbContext dc = new DbContext())
{
aspuser = dc.AspNetUsers.First(x => x.Id == userid);
var user = await UserManager.FindByIdAsync(userid);
user.Email = updatedUser.UserName;
user.UserName = updatedUser.Email;
var result = await UserManager.UpdateAsync(user);
aspuser.tblCountry.AspNetUsers.Remove(aspuser);
await dc.SaveChangesAsync();
}
using (DbContext dc = new DbContext())
{
var c = _country.GetById(newcountryid);
c.AspNetUsers.Add(aspuser);
await dc.SaveChangesAsync();
}
return Users(userid);
}
如果这是一个我可以直接访问的表,那将是非常容易的,但有了这样的ICollection,我不知道该怎么做才能使它工作,我很感激任何输入!
干杯
此行aspuser = dc.AspNetUsers.First(x => x.Id == userid);
位于using (DbContext dc = new DbContext())
内部,这意味着当您离开该块时,对象aspuser将与上下文分离。你应该做:
var c = _country.GetById(newcountryid);
c.AspNetUsers.Add(aspuser);
await dc.SaveChangesAsync();
在与上述代码相同的使用块中,为什么要将其分离?