1

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

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

  • USERID
  • UserName
  • GroupID

Группы:

  • GroupID
  • GroupName

И вот сгенерированные классы:

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 минут и все еще не могу найти ответ. Почему я скучаю?

ответ

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

Он по-прежнему приводит к Null справочного Exception. Вариабельность «group» имеет нулевое значение. – zhulien

+0

О, я исправил это. Мы просто обмениваемся «newGroup» на «группу», и все работает отлично. Я не могу поверить, что я пропустил что-то такое простое. Тем не менее, в главной роли в течение 30 минут не было много хорошего. : D Спасибо! – zhulien

+0

@zhulien добро пожаловать! –

Смежные вопросы