我正在开发一个 Web 应用程序,我想实现 Identity。我已经完成了几个测试,并且在使用代码优先方法时很容易实现。
我的问题是我无法让它与模型优先方法一起工作。我想在 .edmx 文件中定义我的模型,并使用“从模型生成数据库”选项生成我的数据库。
这是我所做的:
我从默认的 ASP .NET Web 应用程序模板开始,包括“个人用户帐户”身份验证。然后我注册了一个用户,以便 Entity Framework 在默认数据库中生成所需的表。 然后我将“ADO .NET 实体数据模型”添加到我的项目中,并选择了“来自数据库的 EF 设计器”选项。它已使用 Identity 创建的现有表成功生成。我更改了 IdentityModels 中的连接字符串:
public ApplicationDbContext()
: base("MyConnectionStringName", throwIfV1Schema: false)
{
}
但在此之后,当我尝试注册用户时,出现以下错误:
“无法加载指定的元数据资源。”
以前,我也有一个错误:“实体类型 ApplicationUser 不是当前上下文模型的一部分。”
是否真的可以通过模型优先方法使用身份?如果是,我做错了什么?
最佳答案
我说过我会发布一些内容来解释我是如何设法让它工作的。我费了好大劲才找到一些关于使用 Identity 和 Model First 方法的文档和教程,所以它来了。
首先,我找到了 Ben Foster 的这篇天才文章:http://benfoster.io/blog/aspnet-identity-stripped-bare-mvc-part-1
本文讨论如何实现“身份剥离裸露”。阅读它并遵循这些步骤让我了解了如何从头开始使用身份(您可以在开始时看到他生成了一个没有身份验证系统的 MVC 5 项目)。 如果你想要这个“裸体身份”的代码,这里是:https://github.com/benfoster/NakedIdentity
第一步是生成数据库。在Naked Identity代码中,使用了Identity的v1.0。有些东西是不同的(例如几个表属性),但它大部分保持相同。 为了创建可供 Identity 使用的数据库,我只是运行了模板 MVC 5 项目,为要使用 Code First 方法创建的表注册了一个用户,然后将 Identity 所需的那些表复制到我的空数据库中。
完成此操作后,我使用新创建的数据库生成了我的 .edmx。连接字符串添加到 web.config。连接字符串可能已作为“DefaultConnection”存在。你也需要保留这个。
基本上,需要这 2 个连接字符串,因为 Identity 将使用默认的一个,而 .edmx 将使用另一个。不可能对两者使用相同的连接字符串,因为 .edmx 连接字符串需要身份不支持的元数据。因此,这 2 个连接字符串是不同的,但我修改了它们,以便它们可以引用同一个数据库。
<connectionStrings>
<add name="DefaultConnectionString" connectionString="Data Source=(LocalDb)\v11.0; Initial Catalog=DatabaseName; Integrated Security=True" providerName="System.Data.SqlClient" />
<add name="EntitiesConnectionString" connectionString="metadata=res://*/Models.WebAppModel.csdl|res://*/Models.WebAppModel.ssdl|res://*/Models.WebAppModel.msl;provider=System.Data.SqlClient;provider connection string="data source=(LocalDb)\v11.0;initial catalog=DatabaseName;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
</connectionStrings>
第一个连接字符串是您要用于实体的连接字符串。下面是 IdentityDbContext 的初始化方式:
`` 公共(public)类 AppDbContext :IdentityDbContext { 公共(public) AppDbContext() : base("QualityWebAppDbEntitiesDefault", throwIfV1Schema: false) {
public static AppDbContext Create()
{
return new AppDbContext();
}
}
`` (您可以在 NakedIdentity 源中找到 AppUser 定义)
对于我的 .edmx,初始化如下所示:
public partial class QualityWebAppDbEntities : DbContext
{
public QualityWebAppDbEntities()
: base("name=QualityWebAppDbEntities")
{
}
}
希望这会帮助那些想要使用 Model First 方法处理身份的人。
关于c# - ASP.NET MVC 5 Identity with Model First,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27659864/