【问题标题】:ASP.NET MVC 5 Identity with Model First具有模型优先的 ASP.NET MVC 5 标识
【发布时间】:2015-02-23 22:15:14
【问题描述】:

我正在开发一个 Web 应用程序,我想实现 Identity。我已经完成了几个测试,使用 Code First 方法时很容易实现。

我的问题是我无法使用 Model First 方法。我想在 .edmx 文件中定义我的模型,并使用“从模型生成数据库”选项生成我的数据库。

这是我所做的:

我从默认的 ASP .NET Web 应用程序模板开始,包括“个人用户帐户”身份验证。然后我注册了一个用户,以便实体框架在默认数据库中生成所需的表。 然后我将“ADO .NET Entity Data Model”添加到我的项目中,并选择了“EF Designer from Database”选项。它已使用 Identity 创建的现有表成功生成。我更改了 IdentityModels 中的连接字符串:

public ApplicationDbContext()
        : base("MyConnectionStringName", throwIfV1Schema: false)
{
}

但是在此之后,当我尝试注册用户时,出现以下错误:

“无法加载指定的元数据资源。”

之前我也遇到过错误:“实体类型ApplicationUser不是当前上下文模型的一部分。”

实际上是否可以将身份与模型优先方法一起使用?如果是,我做错了什么?

【问题讨论】:

  • 我们可以看看连接字符串吗?
  • 我找到了解决问题的方法,我会在实施后立即发布。感谢您的关注。

标签: c# asp.net asp.net-mvc entity-framework ef-model-first


【解决方案1】:

我说过我会发布一些东西来解释我是如何设法让它工作的。我很难找到一些关于将 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 代码中,使用了 v1.0 的 Identity。有些东西是不同的(例如几个表属性),但它基本上是相同的。 要创建 Identity 可用的数据库,我只需运行模板 MVC 5 项目,为要使用 Code First 方法创建的表注册一个用户,然后将 Identity 所需的那些表复制到我的空数据库中。

完成后,我使用新创建的数据库生成了我的 .edmx。一个连接字符串被添加到 web.config。连接字符串可能已作为“DefaultConnection”存在。你也需要保留这个。

基本上,这两个连接字符串是必需的,因为 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=&quot;data source=(LocalDb)\v11.0;initial catalog=DatabaseName;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /> </connectionStrings>

第一个连接字符串是您要与实体一起使用的连接字符串。下面是 IdentityDbContext 的初始化方式:

`` 公共类 AppDbContext : IdentityDbContext { 公共 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") { } }

希望这将帮助那些想要在 Identity 中使用 Model First 方法的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-21
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    相关资源
    最近更新 更多