强制EF ApplicationUser加载导航属性

5

我正在使用EF6/.Net 4.5.1在Web表单上的用户控件中检索数据以获取listview。 我已经修改了ApplicationUser,包括使用FK属性的导航属性[1:1],这一切都很好地运作。

public class ApplicationUser : IdentityUser
{
    public ApplicationUser()
    {
        CreateDate = DateTime.Now;
        :\\ deleted stuff
    }

    public int TaxID { get; set; }
    public System.Guid ApplicationId { get; set; }
    :\\ deleted stuff

    [ForeignKey("TaxID")]
    public virtual Personnel Personnel { get; set; }
}

该模型已迁移并进行了存储和检索测试。

在完全回传时,一切都运行良好。

但是,我在网页上添加了一个按钮,用于打开和关闭包含负责创建新会员的UserControl的div。UserControl抛出一个事件,被容器消费。然后,容器关闭包含UC的div,重新打开包含ListView的div,调用ListView DataBind(),调用GetAllUsers()。

代码如下:

public IQueryable<ApplicationUser> GetAllUsers()
{
    var manager = HttpContext.Current.GetOwinContext()
                             .GetUserManager<ApplicationUserManager>();
    var users = manager.Users.OrderBy(c => c.TaxID);

    return users;
}

当用户控件将控制权返回给容器后,会出现一个问题。
第一次检索 - 始终具有未加载导航属性的ApplicationUser。这意味着某些字段在列表视图中永远不会被填充。
但是,后续的检索(刷新页面或调用行的编辑)似乎会触发导航属性的存在。

Image Showing First and Second Retrieve

  1. 如何强制EF包含导航属性。语法manager.Users.Include()在此上下文中不存在。

  2. 只有列为ApplicationUser的动态代理实体似乎具有导航属性。因此,我很困惑为什么最初检索不是动态代理。

  3. 列表视图的Datapager需要IQueryable来实现分页。我没有调用.ToList(),因为Datapager知道何时进行分页。这一直运作良好... 一旦进行完整页面刷新。为什么需要页面刷新才能使导航属性实现?

任何帮助...提前感谢...

1个回答

5
添加
using System.Data.Entity;

然后您可以使用Include

var users = manager.Users.Include(x=> x.Personnel).OrderBy(c => c.TaxID);

如果您想在任何地方包含导航,可以在IdentityConfig.cs文件中重写ApplicationUserManager.Users,方法如下:

public class ApplicationUserManager : UserManager<ApplicationUser>
{
    public override IQueryable<ApplicationUser> Users
    {
        get
        {
            return base.Users.Include(x=>x.Personnel);//include what you want here
        }
    }
    //Rest of the original code
}

但是现在你如何让框架使用新的自定义ApplicationUserManager - Richard Barraclough
这个不起作用;被覆盖的 Users 没有被触发。 - Richard Barraclough

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接