空实体值
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;
}
我的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;
}