实体框架不保存对数据库的更改

时间:2015-10-30 09:34:38

标签: entity-framework save savechanges

我在使用实体框架保存对数据库的更改时遇到问题。我正在使用三张桌子; AspNetUsers,tblCountry和tblCountry_AspNetUsers。

tblCountry_AspNetUsers由两列组成; UserId和CountryId,它在tblCountry和AspNetUsers之间创建一对多关系。

目前,我想要做的是更改特定用户的国家/地区,但实体框架不允许我访问tblCountry_AspNetUsers数据库,而是在tblCountry上创建AspNetUsers的ICollection。我可以直接在AspNetUser上分配Id,但我不想开始在身份表中添加/删除列,因为我首先使用数据库,而且我听说它可能导致问题。

无论如何,我可以从ICollection中删除并将这些更改保存到数据库,但是当我尝试将同一用户添加到其他国家/地区时,它无法正确保存到数据库,但我可以找到调试时上下文对象中的用户。

我已尝试将实体状态附加并更改为添加和修改,但是当我尝试执行此操作时,它会突破该方法并且不会更新数据库。 (当我试图附上时基本上会冻结)

我编辑用户的代码如下所示:

(请注意,UserManager处理身份用户模型,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我很困惑我应该做些什么来使它工作,我很感激任何输入!

干杯

1 个答案:

答案 0 :(得分:0)

此行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(); 

在与上述代码相同的使用块中,为什么要将它分开?