空实体值

Null entity value

我的User模特:

    public class User
    {
        public int UserId { get; set; }

        public int RoleId { get; set; }

        [Required]
        public string Name { get; set; }
        [Required, DataType(DataType.EmailAddress)]
        public string Email { get; set; }
        [Required, DataType(DataType.Password)]
        public string Password { get; set; }

        public Role Roles { get; set; }
}

我的Roles模特:

public class Role
{
    public int RoleId { get; set; }
    public string Name { get; set; }

    public List<User> Users { get; set; }
}

但是在视图中 Role 的名称是空的...我应该怎么办或者数据库关系或其他任何地方的问题在哪里?

<dt>
    @Html.DisplayNameFor(model => model.Roles.Name)
</dt>

<dd>
    @Html.DisplayFor(model => model.Roles.Name)
</dd>

您可以使用 eager loading 加载相关实体作为查询的一部分来解决该问题,例如:

var query= context.Users.Include(u=>u.Role).Where(...).ToList();

在我上面引用的 link 中,您会找到加载相关实体所需的所有选项。

仅供参考,您的实体不满足需要延迟加载以从您的实体创建代理 类 的所有条件,您可以在其他 link 中查看所有条件。您需要将导航属性声明为 virtual 才能延迟加载,但我建议您在这种情况下使用预先加载。当您在视图中查询导航 属性 时,您的 DbContext 将被释放,因此将抛出异常。

更新

那么您可以创建 GetAll 方法的重载,您可以在其中将要加载的相关实体作为参数传递:

using System.Data.Entity;
//...
public virtual IQueryable<TEntity> GetAll(List<Expression<Func<TEntity, object>>> includes = null) 
{

  IQueryable<TEntity> query = _dbSet; 

  if (includes != null)
  {
     query = includes.Aggregate(query, (current, include) => current.Include(include));
  }
  return query;
}