【问题标题】:Forcing EF ApplicationUser To Load Navigation Properties强制 EF ApplicationUser 加载导航属性
【发布时间】:2015-11-13 04:16:59
【问题描述】:

我正在使用 EF6/.Net 4.5.1 来检索 web 表单上用户控件中的列表视图的数据。我已经使用 FK 属性修改了 ApplicationUser 以包含一个导航属性 [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; }
}

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

完全回发一切正常。

但是,我在网页上添加了一个按钮,用于打开和关闭一个 div,该 div 包含一个负责创建新成员的 UserControl。 UserControl 引发由容器使用的事件。 Container 然后关闭包含 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;
}

UserControl 将控制权返回给 Container 后出现问题。

第一次检索 - 始终有一个未加载 Navigation 属性的 ApplicationUser。这意味着某些字段永远不会填充到列表视图中。

然而,后续检索(刷新页面或调用编辑行)似乎会触发导航属性出现。

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

  2. 只有作为 ApplicationUser 的动态代理列出的实体似乎具有导航属性。所以我很困惑为什么初始检索永远不是动态代理。

  3. 列表视图的 Datapager 需要一个 IQueryable 来实现其分页。我不调用 .ToList() ,因为 Datapager 知道什么时候该调用它一直工作得很好......一旦有一个完整的页面刷新。为什么要实现导航属性需要刷新页面?

任何帮助...在此先感谢...

【问题讨论】:

    标签: c# asp.net entity-framework webforms asp.net-identity


    【解决方案1】:

    添加

    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
    • 这不起作用;被覆盖的Users 未被命中。
    猜你喜欢
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多