2015-10-30 114 views
0

我在使用实体框架保存对数据库的更改时遇到问题。我使用三张桌子; 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,我很困惑我应该怎么做才能使它工作,并且我很欣赏任何输入!

干杯

回答

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

在与上面的代码相同的使用块,你为什么分开它?

+0

我只是尝试将它们分开以查看它所做的区别,但即使它们与remove函数位于同一个块中,出于某种原因它也不会将新的AspNetUsers集合保存到数据库。 –

+0

等一下,如果你有tblCountry_AspNetUsers表,那么它是多对多的关系,而不是一对多,而Entity也应该在AspNetUser类上创建国家ICollection。你有这个财产吗? – Aleksa

+0

不,因为我使用UserId作为tblCountry_AspNetUsers中的主键。 虽然我在AspNetUser类中有; public virtual tblCountry tblCountry {get;组; } –