2015-10-30 166 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;組; } –