Исключение нулевой ссылки при вставке записи в Entity Framework

1

У меня есть простая база данных с 2 выводами, состоящая из пользователей и групп. Вот столбцы таблиц:

Пользователи:

  • Идентификатор пользователя
  • UserName
  • GroupID

Группы:

  • 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; }
}

Мне нужно создать метод, который вставляет пользователя в определенную группу. Если группа не существует, она должна ее создать. Я использую 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 минут и все еще не могу найти ответ. Почему я скучаю?

Теги:
sql-server
entity-framework-6
nullreferenceexception

1 ответ

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' имеет нулевое значение.
  • 0
    О, я исправил это. Мы просто обмениваем «newGroup» на «group», и все работает отлично. Я не могу поверить, что пропустил что-то такое простое. Тем не менее, 30 минут в главной роли не принесли много пользы. : D Спасибо!
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню