1

我有一個簡單的2表格數據庫,由用戶和組組成。下面是表的列:在實體框架中插入記錄時的空引用異常

用戶

  • 用戶名
  • 用戶名
  • 羣ID

  • GROUPID
  • 組名

而這裏是生成的類:

public partial class Group 
{ 
    public Group() 
    { 
     this.Users = new HashSet<User>(); 
    } 

    public int GroupID { get; set; } 
    public string GroupName { get; set; } 

    public virtual ICollection<User> Users { get; set; } 
} 

-

public partial class User 
{ 
    public int UserID { get; set; } 
    public string UserName { get; set; } 
    public Nullable<int> GroupID { get; set; } 

    public virtual Group Group { get; set; } 
} 

我需要作出哪些插入一個用戶爲給定組的方法。如果該組不存在,它應該創建它。我正在使用實體框架。下面是一些代碼:

public class Entry 
{ 
    public static void Main() 
    { 
     using (var dbContext = new UserSystemEntities()) 
     { 
      var user = new User(); 
      user.UserName = "h4x0r"; 

      AddUserToGroup(dbContext, "Admins", user); 

      Console.WriteLine("User {0} added successfully.", user.UserName); 
     } 
    } 

    public static void AddUserToGroup(UserSystemEntities dbContext, string groupName, User user) 
    { 
     using (var dbTransaction = dbContext.Database.BeginTransaction()) 
     { 
      var group = dbContext.Groups.FirstOrDefault(x => x.GroupName == groupName); 

      try 
      { 
       if (group == null) 
       { 
        var newGroup = new Group(); 
        newGroup.GroupName = groupName; 

        dbContext.Groups.Add(newGroup);      
       } 

       dbContext.Groups.FirstOrDefault(x => x.GroupName == group.GroupName).Users.Add(user); 
       dbContext.SaveChanges(); 
      } 
      catch(Exception ex) 
      { 
       Console.WriteLine("Error occured! " + ex.message); 
       dbTransaction.Rollback(); 
      } 

      dbTransaction.Commit(); 
     } 
    } 
} 

有與添加的用戶組中的一個問題:

dbContext.Groups.FirstOrDefault(x => x.GroupName == group.GroupName).Users.Add(user); 

拋出一個空引用異常,我只是不能找出原因。現在主演約20分鐘,但仍無法找到答案。我爲什麼想念?

回答

3

問題是,您試圖從您的數據庫中獲取一個不存在的組並將用戶附加到它。

如果將新的小組,你是一個if條款不會被保存到自動數據庫裏面做的背景,這就是爲什麼當你調用FirstOrDefault方法,該方法查詢數據庫,它爲你的記錄是失敗不在那裏。所以,當你有一個組(無論是從數據庫還是新創建的),你可以使用你的group變量,並附上User

您應該修改代碼以下列:

var group = dbContext.Groups.FirstOrDefault(x => x.GroupName == groupName); 

    try 
    { 
     if (group == null) 
     { 
      group = new Group(); 
      group.GroupName = groupName; 

      dbContext.Groups.Add(group);      
     } 

     group.Users.Add(user); 
     dbContext.SaveChanges(); 
    } 
    catch(Exception ex) 
    { 
     Console.WriteLine("Error occured! " + ex.message); 
     dbTransaction.Rollback(); 
    } 

    dbTransaction.Commit(); 
+0

仍然導致空引用異常。 'group'varible有一個空值。 – zhulien 2014-12-06 23:06:13

+0

哦,我修好了。我們只是用'group'交換'newGroup',一切正常。我不相信我錯過了那麼簡單的事情。然而,主演30分鐘沒有太多好處。 :D謝謝! – zhulien 2014-12-06 23:15:24

+0

@zhulien不客氣! – 2014-12-06 23:16:51