我的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>
答案 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;
}