我在使用实体框架保存对数据库的更改时遇到问题。我使用三张桌子; AspNetUsers,tblCountry和tblCountry_AspNetUsers。实体框架不保存对数据库的更改
tblCountry_AspNetUsers由两列组成; UserId和CountryId,它创建了tblCountry和AspNetUsers之间的一对多关系。
目前,我想要做的是更改特定用户的国家,但实体框架不允许我访问tblCountry_AspNetUsers数据库,而是在tblCountry上创建一个AspNetUsers的ICollection。我可以直接在AspNetUser上分配Id,但我不想开始从身份表添加/删除列,因为我首先使用数据库,并且我听说它可能导致问题。
无论如何,我可以从ICollection中移除这些更改并将这些更改保存到数据库,但是当我尝试将同一用户添加到其他国家/地区时,它不会正确保存到数据库,但我可以找到用户在调试时在上下文对象中。
我尝试过将附加和更改的entitystate添加和修改,但是当我尝试这样做时,它突破了方法,并没有更新数据库。 (基本上冻结当我尝试附加)
我的代码修改用户看起来如下:
(注意的UserManager处理身份的usermodel,ApplicationUser ,,这是不一样的AspNetUsers在这方面)
(另外,tblCountry.AspNetUsers是指用户分配到特定国家的ICollection)
...
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,我很困惑我应该怎么做才能使它工作,并且我很欣赏任何输入!
干杯
我只是尝试将它们分开以查看它所做的区别,但即使它们与remove函数位于同一个块中,出于某种原因它也不会将新的AspNetUsers集合保存到数据库。 –
等一下,如果你有tblCountry_AspNetUsers表,那么它是多对多的关系,而不是一对多,而Entity也应该在AspNetUser类上创建国家ICollection。你有这个财产吗? – Aleksa
不,因为我使用UserId作为tblCountry_AspNetUsers中的主键。 虽然我在AspNetUser类中有; public virtual tblCountry tblCountry {get;组; } –