Identity Owin 是不是需要延迟加载?

Posted

技术标签:

【中文标题】Identity Owin 是不是需要延迟加载?【英文标题】:Does Identity Owin require LazyLoading?Identity Owin 是否需要延迟加载? 【发布时间】:2014-01-19 01:37:51 【问题描述】:

tl;dr:身份似乎要求不禁用 LazyLoading;这是真的吗?最干净的解决方法是什么?

我使用 EntityFramework 6.0.2、Identity EntityFramework 1.0.0 和 Identity Owin 1.0.0 对一个简单的 C# ASP.NET 4.5.1 MVC-5 Web 应用程序进行了一些基本 AB 测试,看来 Owin 需要这种惰性ApplicationContext 构造函数中未禁用加载。

要复制该问题,只需使用 Visual Studio 2013 制作一个快速 MVC 应用程序,使用 MVC 模板,将所有内容保留为默认值,但取消注释以下行:'app.UseGoogleAuthentication();'在 App_Start/Startup.Auth.cs 中。运行应用程序并使用谷歌登录,完成它带您进入的简短注册页面,然后转到帐户/管理。您应该在底部看到 2 个用于 Google 的按钮。停止应用。

现在转到 ApplicationContext.cs 并更改构造函数,如以下代码 sn-p 所示:

public ApplicationContext() : base("DefaultConnection")   //Works!

public ApplicationContext() : base("DefaultConnection") 

    this.Configuration.LazyLoadingEnabled = false;
 //Does not work

重试测试。应该只有 1 个 Google 按钮可见。使用 LazyLoadingEnabled = false 时,不会加载用户角色、登录(也可能是声明)。

我的理论是,这是 Microsoft 的疏忽/“未来功能”,因为 Identity EntityFramework 和 Identity Owin 都是 1.0.0 版。

我的问题是,这个测试能否得到确认,最干净的解决方法是什么?

出于我的目的,当我想使用它时,我将只使用 .ToList() 和其他强制 EagerLoading 的方法。我并不真正需要禁用 LazyLoading,如果您想始终使用急切加载,这只是一种更安全的编码方式。即你错过了一个地方,它进入了生产环境,并且你有一个很好的错误,在某些视图中你正在迭代一个模型并且对于 Model.x.y y == null 并且数据库连接已被释放。

我们不要讨论 Identity 与其他(更强大的)方法,或者:

using (DatabaseContext)  //Database query  

或在每个方法上调用 dispose 与让连接自动处理。在这种情况下,您必须使用 Identity Owin,并尽快处理所有数据库调用。应该是我遗漏了一些东西,或者说现在的身份真的是那么不完整。

【问题讨论】:

OWIN 和 Katana 与 ASP.NET 标识不同。我建议构建一个使用 ASP.NET Identity 的控制台应用程序来证明或反驳您在这篇文章中的内容。 【参考方案1】:

是的,这是我们在 2.0.0-alpha1 版本中修复的错误。之前显式禁用了lazyLoading,EF 不会自动加载关联的用户实体(登录/声明/角色)

【讨论】:

有趣的是,这种真诚的忏悔是否应该因为这个错误而被赞成或反对......我会赞成。 这正是我一直在寻找的,现在我知道在哪个版本之后我可以尝试删除我的解决方法。这也解释了为什么 [Authorize(Roles = "Admin")] 不起作用。相当令人沮丧的错误。虽然我可以看到它是如何被遗漏的,但由于性能问题,通常会避免强制急切加载。对于我的特定应用程序,Db 模型非常简单,应该没有明显的区别,并且允许我在查询完成后立即关闭连接。 @Hao Kung 这是否与我在其他问题上遇到的问题相同:***.com/questions/24214840/… ? 如果想要获得所有个用户并汇总他们的声明怎么办?

以上是关于Identity Owin 是不是需要延迟加载?的主要内容,如果未能解决你的问题,请参考以下文章

没有 OWIN 和 AspNet.Identity 的基于 Asp.Net Web Api 令牌的授权

ASP.NET (OWIN) Identity:如何从 Web API 控制器获取 UserID?

ASP.NET Core Identity UserManager 返回用户而不包含相关对象(延迟加载)

将 EfCore 延迟加载代理与 blazor 一起使用

MVC Owin Identity 2 CheckPasswordAsync() 不会执行

ASP.NET Identity 2.0 解密 Owin cookie