我有一个简单的2表数据库,由用户和组组成。以下是表格的列:
用户:
组:
以下是生成的类:
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分钟仍然无法找到答案。为什么我会错过?
答案 0 :(得分:3)
问题是您正在尝试从数据库中获取一个不存在的组并将用户附加到该组。
如果将新组附加到您在if
子句中执行的上下文中,它将不会自动保存到DB中,这就是为什么当您调用查询数据库的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();