【发布时间】: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 的控制台应用程序来证明或反驳您在这篇文章中的内容。
标签: c# asp.net-mvc-5 entity-framework-6 asp.net-identity owin