【问题标题】:Repository Pattern Null Reference Exception in Controller控制器中的存储库模式空引用异常
【发布时间】:2014-01-29 06:55:23
【问题描述】:

我已经实现了通用存储库模式和 UnitOfWork,但是当我尝试填充模型类的新实例时,我的控制器中出现空引用异常。

这是我的存储库模式:

class GenericRepository<TEntity> where TEntity : class
{
    internal PropmetEntities context;
    internal DbSet<TEntity> dbSet;

    public GenericRepository(PropmetEntities context)
    {
        this.context = context;
        this.dbSet = context.Set<TEntity>();
    }

    public virtual IEnumerable<TEntity> Get()
    {
        IQueryable<TEntity> query = dbSet;
        return query.ToList();
    }

    public virtual TEntity GetByID(object id)
    {
        return dbSet.Find(id);
    }

    public virtual void Insert(TEntity entity)
    {
        dbSet.Add(entity);
    }

    public virtual void Delete(object id)
    {
        TEntity entityToDelete = dbSet.Find(id);
        Delete(entityToDelete);
    }

    public virtual void Delete(TEntity entityToDelete)
    {
        if (context.Entry(entityToDelete).State == EntityState.Detached)
        {
            dbSet.Attach(entityToDelete);
        }
        dbSet.Remove(entityToDelete);
    }

    public virtual void Update(TEntity entityToUpdate)
    {
        dbSet.Attach(entityToUpdate);
        context.Entry(entityToUpdate).State = EntityState.Modified;
    }
}

这是我的工作单元:

class UnitOfWork 
{
    private PropmetEntities context = new PropmetEntities();
    private GenericRepository<User> userRepository;

    public GenericRepository<User> UserRepository
    {
        get
        {
            if (this.userRepository == null)
                this.userRepository = new GenericRepository<User>(context);
            return userRepository;
        }
    }
}

这是我的模型类:

public class UserGridModel
{
    public int ID { get; set; }
    public string Username {get; set;}
    public string EMail { get; set; }
    public string Surname { get; set; }
    public string Role { get; set; }
    public ContactInformation ContactInformation { get; set; }
    public Role Role1 { get; set; }
}

这是我的控制器操作:

private UnitOfWork.UnitOfWork unitOfWork = new UnitOfWork.UnitOfWork();

    [PrivilegeFilter(priv = Privileges.UserView)]
    public ActionResult Grid(GridSettings set)
    {
        var userList = from user in unitOfWork.UserRepository.Get() select user;
        var users = new List<UserGridModel>();
        if (userList.Any())
        {
            foreach (var user in userList)
            {
                users.Add(new UserGridModel()
                {
                    ID = user.ID,
                    Username = user.Username,
                    EMail = user.ContactInformation.EMail,
                    Surname = user.ContactInformation.Surname,
                    Role = user.Role1.Description
                });



            }
        }

        GridModel grid = new GridModel(set, users.Count());
        grid.rows = users.Skip((set.PageIndex - 1) * set.PageSize).Take(set.PageSize).ToList();
        return Json(grid, JsonRequestBehavior.AllowGet);

    }

我在这里得到一个空引用异常:

users.Add(new UserGridModel()
            {
                ID = user.ID,
                Username = user.Username,
                EMail = user.ContactInformation.EMail,
                Surname = user.ContactInformation.Surname,
                Role = user.Role1.Description
            });

【问题讨论】:

  • 你可能有 user.ContactInformation == null。
  • 不要。创造。通用的。存储库。
  • @Phill 你能解释一下为什么不这样做吗?创造。通用的。存储库?
  • 因为 IRepository 和 GenericRepositor(ies) 对您的域做出假设。它假定所有对象都具有主键,而从不具有复合键。即一切都可以创建或更新,一切都可以获取或列出。这些都是错误的假设。这是糟糕的设计。

标签: c# asp.net-mvc repository-pattern unit-of-work


【解决方案1】:

你有用户的 ContactInformation 吗?我的猜测是 user.ContactInformation 为 null,并且在获取 user.ContactInformation.Email 时出现错误。

【讨论】:

  • 我在数据库中的ContactInformation 字段为空。我只是在创建新用户时将它们设为必填字段,以便它们不能为空。
【解决方案2】:

可能的原因是 user.ContactInformation == nulluser.Role1 == null。您应该在 UserGridModel 创建代码中添加一些空值检查。

【讨论】:

    【解决方案3】:

    您可以通过null 执行以下操作来检查:

    foreach (var user in userList.Where(x => x.ContactInformation != null && x.Role1 != null))
    {
        users.Add(new UserGridModel()
        {
            ID = user.ID,
            Username = user.Username,
            EMail = user.ContactInformation.EMail,
            Surname = user.ContactInformation.Surname,
            Role = user.Role1.Description
        });
     }
    

    当这些属性之一是null 时,这至少可以防止您获得空引用异常

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多