tl;dr:Identity 似乎要求不禁用 LazyLoading;这是真的吗?最干净的解决方法是什么?
我使用 EntityFramework 6.0.2、Identity EntityFramework 1.0.0 和 Identity Owin 1.0.0 在一个简单的 C# ASP.NET 4.5.1 MVC-5 Web 应用程序上进行了一些基本的 A-B 测试,看起来 Owin 需要 lazy ApplicationContext 构造函数中未禁用加载。
要复制该问题,只需使用 Visual Studio 2013 制作一个快速的 MVC 应用程序,使用 MVC 模板,将所有内容保留为默认值,除了取消注释以下行:'app.UseGoogleAuthentication();'在 App_Start/Startup.Auth.cs 中。运行该应用程序并使用 Google 登录,完成它带您进入的简短注册页面并转到帐户/管理。您应该会在底部看到 2 个 Google 按钮。停止应用程序。
现在转到 ApplicationContext.cs 并更改构造函数,如以下代码片段所示:
public ApplicationContext() : base("DefaultConnection") { } //Works!
public ApplicationContext() : base("DefaultConnection")
{
this.Configuration.LazyLoadingEnabled = false;
} //Does not work
重试测试。只有 1 个 Google 按钮应该可见。使用 LazyLoadingEnabled = false,用户角色、登录(也可能声明)不会加载。
我的理论是,这是 Microsoft 的疏忽/“ future 功能”,因为 Identity EntityFramework 和 Identity Owin 都是 1.0.0 版。
我的问题是,这个测试能否得到确认,最干净的解决方法是什么?
出于我的目的,我将只使用 .ToList() 和其他方法在我想使用它时强制执行 EagerLoading。我真的不需要禁用 LazyLoading,如果您想始终使用预先加载,这只是一种更安全的编码方式。也就是说,你错过了一个地方,它进入了生产环境,并且你有一个很好的错误,在某些 View 中你正在迭代模型和 Model.x.y y == null 并且数据库连接已被释放。
我们不要讨论 Identity 与其他(更强大的)方法,或者:
using (DatabaseContext) { //Database query }
或在每个方法上调用 dispose 与让连接自动释放。在这种情况下,您必须使用 Identity Owin,并尽快处理所有数据库调用。应该有一些我遗漏的东西,或者也许身份现在真的是那么不完整。
最佳答案
是的,这是我们在 2.0.0-alpha1 版本中修复的错误。在之前明确禁用 lazyLoading 的情况下,EF 不会自动加载关联的用户实体(登录名/声明/角色)
关于c# - Identity Owin 是否需要延迟加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20868836/