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中。运行应用程序并使用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时,不会加载用户角色,登录(也可能是索赔)。
我的理论是,这是微软的监督/'未来功能',因为Identity EntityFramework和Identity Owin都是版本1.0.0。
我的问题是,这个测试能否得到确认,最干净的工作是什么?
出于我的目的,我将使用.ToList()和其他方法在我想使用它时强制执行EagerLoading。我并不真的需要禁用LazyLoading,如果你想总是使用预先加载,它只是一种更安全的代码编写方式。即你错过了一个地方,它使它生产,你有一个很好的错误,在某些视图中你正在迭代模型和Model.x.y y == null并且已经处理了数据库连接。
让我们不要进入身份与其他(更强大)的方法,或者:
using (DatabaseContext) { //Database query }
或在每个方法上调用dispose,而不是自动处理连接。在这种情况下,您必须使用Identity Owin,并尽快处理所有数据库调用。应该有一些我想念的东西,或者说现在身份真的不完整。
答案 0 :(得分:12)
是的,这是我们在2.0.0-alpha1版本中修复的错误。在事先明确禁用lazyLoading的情况下,EF不会自动加载关联的用户实体(登录/声明/角色)