2017-06-19 67 views
0

我正在使用實體框架與MVC5應用程序,目前我正試圖保存一些表單數據,觸及我的數據庫中的多個表。當我向表中添加數據時,它似乎工作正常,但是一旦我打到橋表時,我會得到一個空引用異常,對我而言,這沒有意義。實體框架添加到橋表時的空引用異常

我是新手編程,所以任何幫助將不勝感激。

public void RegisterNewUser(IDCRegisterViewModel model) 
    { 
     // 
     string fullAddress = model.AddressLine1 + "\n" + model.AddressLine2 + (string.IsNullOrEmpty(model.AddressLine2) ? "" : "\n") + model.City + ", " + model.State + " " + model.Zip + "\n" + model.Country; 
     using (var AuthContext = new InfoKeeperEntities1()) 
     { 
      AuthContext.Locations.Add(new Location { 
       Line1 = model.AddressLine1, 
       Line2 = model.AddressLine2, 
       City = model.City, 
       State = model.State, 
       Zip = model.Zip, 
       Country = model.Country, 
       UserID = model.UserID, 
       FullAddr = fullAddress 
      }); 

      AuthContext.ProfileDatas.Add(new ProfileData 
      { 
       UserID = model.UserID, 
       UACC = model.UACC, 
       isRecCenter = model.IsRecCenter, 
       isCustAdmin = model.IsCustAdmin 
      }); 

      //Add to bridge tables for user/dept and group/dept 
      List<Department> deptList = new List<Department>(); 
      foreach (var ID in model.GroupIDs) 
      { 
       deptList.Add(AuthContext.Departments.FirstOrDefault(x => x.ID == ID)); 
      } 

      foreach (var department in deptList) 
      { 
       //NULL REF EXCEPTION HERE 
       AuthContext.AspNetUsers.FirstOrDefault(x => x.Id == model.UserID).Departments.Add(department); 

       foreach (var groupID in model.GroupIDs) 
       { 
        AuthContext.Groups.FirstOrDefault(x => x.ID == groupID).Departments.Add(department); 
       } 
      } 
     } 
    } 
+0

請註明線扔空參考例外。 – mjw

+0

已更新。謝謝。 – SentOnLine

+0

在你的代碼中放置一個斷點,在你有NULL REF的行上,當它遇到斷點時,突出顯示AuthContext.AspNetUsers.FirstOrDefault(x => x.Id == model.UserID)行的這一部分,右邊點擊並選擇快速查看,看看這個LINQ語句是否返回任何內容。 – mjw

回答

1

如果你把LazyLoadingEnabledProxyCreationEnabled關你總是有一個錯誤,因爲面對使用後的Department查詢FirstorDefaultEntityFramework不包括它AppUsers,你必須與添加的部門向集團同樣的問題。所以你必須首先爲他們包括部門。

using System.Data.Entity;放在第一個代碼中。 更改代碼語句如下:

public void RegisterNewUser(IDCRegisterViewModel model) 
{ 
    string fullAddress = model.AddressLine1 + "\n" + model.AddressLine2 + (string.IsNullOrEmpty(model.AddressLine2) ? "" : "\n") + model.City + ", " + model.State + " " + model.Zip + "\n" + model.Country; 
    using (var AuthContext = new InfoKeeperEntities1()) 
    { 
     AuthContext.Locations.Add(new Location { 
      Line1 = model.AddressLine1, 
      Line2 = model.AddressLine2, 
      City = model.City, 
      State = model.State, 
      Zip = model.Zip, 
      Country = model.Country, 
      UserID = model.UserID, 
      FullAddr = fullAddress 
     }); 

     AuthContext.ProfileDatas.Add(new ProfileData 
     { 
      UserID = model.UserID, 
      UACC = model.UACC, 
      isRecCenter = model.IsRecCenter, 
      isCustAdmin = model.IsCustAdmin 
     }); 

     //Add to bridge tables for user/dept and group/dept 
     List<Department> deptList = new List<Department>(); 
     foreach (var ID in model.GroupIDs) 
     { 
      deptList.Add(AuthContext.Departments.FirstOrDefault(x => x.ID == ID)); 
     } 
     var user = AuthContext.AspNetUsers.Include("Departments").FirstOrDefault(x => x.Id == model.UserID);   
     foreach (var department in deptList) 
     { 
      user.Departments.Add(department); 

      foreach (var groupID in model.GroupIDs) 
      { 
       var group = AuthContext.Groups.Include("Departments").FirstOrDefault(x => x.ID == groupID); 
       group.Departments.Add(department); 
      } 
     } 
    } 
} 

提示:不要忘記做的List<Depatment>一個新實例中的AspNetUsersGroups構造:

public class ApplicationUser 
{ 
    Public ApplicationUser() 
    { 
     this.Departments = new List<Department>(); 
    } 
} 
public class Group 
{ 
    Public Group() 
    { 
     this.Departments = new List<Department>(); 
    } 
} 
+0

@SentOnLine你想考慮嗎?我已更新! –