空实体值

时间:2016-03-14 19:15:24

标签: asp.net entity-framework view model entity

我的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>

1 个答案:

答案 0 :(得分:1)

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

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

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

仅仅是一个FYI,您的实体不满足从您的实体创建代理类需要延迟加载的所有条件,您可以看到此另一个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;
}