У меня есть простая база данных с 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; }
}
Мне нужно создать метод, который вставляет пользователя в определенную группу. Если группа не существует, она должна ее создать. Я использую Entity Framework. Вот какой код:
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);
бросая Null Reference Exception, и я просто не могу понять, почему. Играя в это время около 20 минут и все еще не могу найти ответ. Почему я скучаю?
Проблема в том, что вы пытаетесь получить группу из своей базы данных, которая не существует, и присоединяет к ней пользователя.
Если вы присоедините новую группу к контексту, который вы делаете внутри предложения 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();