c# - Entity Framework 中记录插入的空引用异常

标签 c# .net sql-server entity-framework-6 nullreferenceexception

<分区>

我有一个简单的 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();

关于c# - Entity Framework 中记录插入的空引用异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27337496/

相关文章:

C#多线程查询

c# - 复制对象而不保留引用

.net - SQL CLR 调试获取 "Canceled by user"

.net - 查找两个 .NET 数据表的交集

sql - Transact-SQL 总结耗时

c# - 为什么我们使用 CLR 程序

c# - .NET SDK 中的 Couchbase NodeUnavailableException

c# - 使方法静态可以提高性能,在什么情况下?

sql-server - 如何在 SQL Server 中查找非空约束的名称

sql-server - 如何找到在SQL Server中注册的程序集?