什么将 ApplicationUser 绑定到 Database First 中的 aspnetusers table?
What binds ApplicationUser to the aspnetusers table in Database First?
我在单独的库(例如 Common.Feedback.Data
)中有一个数据库优先的 EDMX 模型,其中包括 AspNetUser
table 及其相关的身份框架 table (从另一个现有的,有效的 database/application 中提取)。
我已更新 ApplicationDbContext
连接字符串以指向新模型和新数据库连接:
using System.Data.Entity;
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
namespace Feedback.MvcApplication.Models
{
// You can add profile data for the user by adding more properties to your ApplicationUser class, please visit http://go.microsoft.com/fwlink/?LinkID=317594 to learn more.
public class ApplicationUser : IdentityUser
{
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
return userIdentity;
}
}
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("FeedbackEntities", throwIfV1Schema: false)
{
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
}
}
web.config 中的连接字符串包含程序集的完整路径并且该引用没问题:
<add name="FeedbackEntities"
connectionString="metadata=res://Common.Feedback.Data/FeedbackModel.csdl|res://Common.Feedback.Data/FeedbackModel.ssdl|res://Common.Feedback.Data/FeedbackModel.msl;provider=System.Data.SqlClient;provider connection string="data source=mydatabase.database.windows.net;initial catalog=Feedback;persist security info=True;user id=LeaveFeedbackuser@mydatabase;password=mypassword;MultipleActiveResultSets=True;App=EntityFramework""
providerName="System.Data.EntityClient" />
在运行时,对登录的任何访问都会导致以下错误:
"The entity type ApplicationUser is not part of the model for the current context"
我尝试过的与该错误相关的所有链接通常都涉及更新迁移的方法。
我无法启用迁移,因为它是 EDMX 首次设置,但我假设 ApplicationUser
对象和后面的 aspnetusers
table "somewhere" 之间存在绑定场景。
这里有没有人清楚ApplicationUser
class在运行时是如何映射to/fromaspnetusers
table并解释如何得到的我的代码与数据库一起使用?
重现步骤
- 使用 VS 2013 创建新的 MVC Web 应用程序
- 将所有 NuGet 包更新到最新版本
- 使用身份框架 table 获取现有 SQL 数据库并将其复制到新的 table(删除任何不相关的 table)。
- 为项目添加新的 tables
- 创建一个 class 库来保存数据模型(例如
Common.Feedback.Data
)
- 根据之前创建的数据库,将 Edmx 数据模型添加到库中
- 更改连接字符串以完全限定程序集(不是
res://*/
)
- 更改
IdentityModel.cs
中的连接字符串名称以匹配配置中的连接字符串名称。
- 将连接字符串从库的
app.config
复制到 Web 项目的 web.config
- 尝试登录,你会遇到提到的错误
更新:
基于一个迷路 post,我更改了我的连接字符串以匹配身份框架默认配置使用的正常 SQL 连接(并使用 Sql 客户端) :
<add name="FeedbackSql"
connectionString="data source=mydatabase.database.windows.net;initial catalog=Feedback;persist security info=True;user id=LeaveFeedbackuser@mydatabase;password=mypassword;MultipleActiveResultSets=True;App=EntityFramework"
providerName="System.Data.SqlClient" />
并更改为使用此新连接的设置:
public ApplicationDbContext()
: base("FeedbackSql", throwIfV1Schema: false)
{
}
奇怪的是错误变成了:
The magic number in GZip header is not correct. Make sure you are passing in a GZip stream.
我认为对 Sql 客户端提供程序的初始更改是正确的,因此这个新错误可能与通过该连接使用 Azure 数据库有关。我愿意接受有关下一步尝试的建议。
根据@rism 和this link 的建议更新了 web.config(但 GZip 错误仍然存在):
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
<parameters>
<!--<parameter value="mssqllocaldb" />-->
<parameter value="data source=mydatabase.database.windows.net;initial catalog=Feedback;persist security info=True;user id=myuserid;password=mypassword;MultipleActiveResultSets=True;App=EntityFramework" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
再次根据@rism 的提示,我也尝试了这个版本(但 GZip 错误仍然存在):
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
<parameters>
<parameter value="v12.0" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
新更新:
我使用标准 user-security 选项创建了一个全新的 Web 应用程序。我还在 Azure 中创建了一个空数据库。
除了将默认连接字符串更改为以下内容外,我什么也没做:
<connectionStrings>
<add name="DefaultConnection"
connectionString="data source=mydatabase.database.windows.net;initial catalog=Feedback;persist security info=True;user id=LeaveFeedbackuser;password=mypassword;MultipleActiveResultSets=True;App=EntityFramework"
providerName="System.Data.SqlClient" />
</connectionStrings>
和默认的连接工厂:
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
<parameters>
<parameter value="v12.0" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
尝试登录时出现以下错误:
The magic number in GZip header is not correct. Make sure you are
passing in a GZip stream. Description: An unhandled exception
occurred during the execution of the current web request. Please
review the stack trace for more information about the error and where
it originated in the code.
Exception Details: System.IO.InvalidDataException: The magic number
in GZip header is not correct. Make sure you are passing in a GZip
stream.
Source Error:
Line 153: { Line 154: var user = new
ApplicationUser { UserName = model.Email, Email = model.Email }; Line
155: var result = await UserManager.CreateAsync(user,
model.Password); Line 156: if (result.Succeeded) Line
157: {
最初的问题是关于 OWIN
如何将 ApplicationUser
class 映射到 AspNetUsers
table。
我用DotPeek反编译了Identity Framework dll,发现table名称"AspNetUsers"只是hard-wired到OnModelCreating
方法的代码中。例如
protected virtual void OnModelCreating(DbModelBuilder modelBuilder)
{
if (modelBuilder == null)
throw new ArgumentNullException("modelBuilder");
EntityTypeConfiguration<TUser> typeConfiguration1 = ((EntityTypeConfiguration<TUser>) modelBuilder.Entity<TUser>())
.ToTable("AspNetUsers");
该代码使用反射从 ApplicationUser 中的属性生成字段名称列表。它使用一个简单的 SQL 查询(系统 table 包含所有字段名称)检查所有这些字段名称是否存在,并确认它们都存在。
其余部分是使用构造的 SQL 查询 names/values 的简单映射。
至于问题的另一部分,数据库连接,我创建了一个新问题,因为 a) 与这个问题的标题无关,b) 快把我逼疯了! 新题是Why am I getting "The magic number in GZip header is not correct." error using OWIN auth against Azure SQL
我在单独的库(例如 Common.Feedback.Data
)中有一个数据库优先的 EDMX 模型,其中包括 AspNetUser
table 及其相关的身份框架 table (从另一个现有的,有效的 database/application 中提取)。
我已更新 ApplicationDbContext
连接字符串以指向新模型和新数据库连接:
using System.Data.Entity;
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
namespace Feedback.MvcApplication.Models
{
// You can add profile data for the user by adding more properties to your ApplicationUser class, please visit http://go.microsoft.com/fwlink/?LinkID=317594 to learn more.
public class ApplicationUser : IdentityUser
{
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
return userIdentity;
}
}
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("FeedbackEntities", throwIfV1Schema: false)
{
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
}
}
web.config 中的连接字符串包含程序集的完整路径并且该引用没问题:
<add name="FeedbackEntities"
connectionString="metadata=res://Common.Feedback.Data/FeedbackModel.csdl|res://Common.Feedback.Data/FeedbackModel.ssdl|res://Common.Feedback.Data/FeedbackModel.msl;provider=System.Data.SqlClient;provider connection string="data source=mydatabase.database.windows.net;initial catalog=Feedback;persist security info=True;user id=LeaveFeedbackuser@mydatabase;password=mypassword;MultipleActiveResultSets=True;App=EntityFramework""
providerName="System.Data.EntityClient" />
在运行时,对登录的任何访问都会导致以下错误:
"The entity type ApplicationUser is not part of the model for the current context"
我尝试过的与该错误相关的所有链接通常都涉及更新迁移的方法。
我无法启用迁移,因为它是 EDMX 首次设置,但我假设 ApplicationUser
对象和后面的 aspnetusers
table "somewhere" 之间存在绑定场景。
这里有没有人清楚ApplicationUser
class在运行时是如何映射to/fromaspnetusers
table并解释如何得到的我的代码与数据库一起使用?
重现步骤
- 使用 VS 2013 创建新的 MVC Web 应用程序
- 将所有 NuGet 包更新到最新版本
- 使用身份框架 table 获取现有 SQL 数据库并将其复制到新的 table(删除任何不相关的 table)。
- 为项目添加新的 tables
- 创建一个 class 库来保存数据模型(例如
Common.Feedback.Data
) - 根据之前创建的数据库,将 Edmx 数据模型添加到库中
- 更改连接字符串以完全限定程序集(不是
res://*/
) - 更改
IdentityModel.cs
中的连接字符串名称以匹配配置中的连接字符串名称。 - 将连接字符串从库的
app.config
复制到 Web 项目的web.config
- 尝试登录,你会遇到提到的错误
更新:
基于一个迷路 post,我更改了我的连接字符串以匹配身份框架默认配置使用的正常 SQL 连接(并使用 Sql 客户端) :
<add name="FeedbackSql"
connectionString="data source=mydatabase.database.windows.net;initial catalog=Feedback;persist security info=True;user id=LeaveFeedbackuser@mydatabase;password=mypassword;MultipleActiveResultSets=True;App=EntityFramework"
providerName="System.Data.SqlClient" />
并更改为使用此新连接的设置:
public ApplicationDbContext()
: base("FeedbackSql", throwIfV1Schema: false)
{
}
奇怪的是错误变成了:
The magic number in GZip header is not correct. Make sure you are passing in a GZip stream.
我认为对 Sql 客户端提供程序的初始更改是正确的,因此这个新错误可能与通过该连接使用 Azure 数据库有关。我愿意接受有关下一步尝试的建议。
根据@rism 和this link 的建议更新了 web.config(但 GZip 错误仍然存在):
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
<parameters>
<!--<parameter value="mssqllocaldb" />-->
<parameter value="data source=mydatabase.database.windows.net;initial catalog=Feedback;persist security info=True;user id=myuserid;password=mypassword;MultipleActiveResultSets=True;App=EntityFramework" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
再次根据@rism 的提示,我也尝试了这个版本(但 GZip 错误仍然存在):
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
<parameters>
<parameter value="v12.0" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
新更新:
我使用标准 user-security 选项创建了一个全新的 Web 应用程序。我还在 Azure 中创建了一个空数据库。
除了将默认连接字符串更改为以下内容外,我什么也没做:
<connectionStrings>
<add name="DefaultConnection"
connectionString="data source=mydatabase.database.windows.net;initial catalog=Feedback;persist security info=True;user id=LeaveFeedbackuser;password=mypassword;MultipleActiveResultSets=True;App=EntityFramework"
providerName="System.Data.SqlClient" />
</connectionStrings>
和默认的连接工厂:
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
<parameters>
<parameter value="v12.0" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
尝试登录时出现以下错误:
The magic number in GZip header is not correct. Make sure you are passing in a GZip stream. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.IO.InvalidDataException: The magic number in GZip header is not correct. Make sure you are passing in a GZip stream.
Source Error:
Line 153: { Line 154: var user = new ApplicationUser { UserName = model.Email, Email = model.Email }; Line 155: var result = await UserManager.CreateAsync(user, model.Password); Line 156: if (result.Succeeded) Line 157: {
最初的问题是关于 OWIN
如何将 ApplicationUser
class 映射到 AspNetUsers
table。
我用DotPeek反编译了Identity Framework dll,发现table名称"AspNetUsers"只是hard-wired到OnModelCreating
方法的代码中。例如
protected virtual void OnModelCreating(DbModelBuilder modelBuilder)
{
if (modelBuilder == null)
throw new ArgumentNullException("modelBuilder");
EntityTypeConfiguration<TUser> typeConfiguration1 = ((EntityTypeConfiguration<TUser>) modelBuilder.Entity<TUser>())
.ToTable("AspNetUsers");
该代码使用反射从 ApplicationUser 中的属性生成字段名称列表。它使用一个简单的 SQL 查询(系统 table 包含所有字段名称)检查所有这些字段名称是否存在,并确认它们都存在。
其余部分是使用构造的 SQL 查询 names/values 的简单映射。
至于问题的另一部分,数据库连接,我创建了一个新问题,因为 a) 与这个问题的标题无关,b) 快把我逼疯了! 新题是Why am I getting "The magic number in GZip header is not correct." error using OWIN auth against Azure SQL