首页 文章

ASP.NET MVC 5与Model First的身份

提问于
浏览
3

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

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

这就是我所做的:

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

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

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

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

以前,我也有一个错误:“实体类型ApplicationUser不是当前上下文模型的一部分 . ”

实际上是否可以将Identity与Model First方法一起使用?如果是的话,我做错了什么?

1 回答

  • 3

    我说我会发布一些东西,以解释我是如何设法让这个工作的 . 我很难找到一些关于在Model First方法中使用Identity的文档和教程,所以来了 .

    首先,我从Ben Foster那里找到了这篇天才文章:http://benfoster.io/blog/aspnet-identity-stripped-bare-mvc-part-1

    本文讨论如何实现"Identity Stripped Bare" . 阅读它并按照步骤让我理解如何从头开始使用身份(你可以看到他开始生成一个没有身份验证系统的MVC 5项目) . 如果你想要这个"Naked Identity"的代码,这里是:https://github.com/benfoster/NakedIdentity

    第一步是生成数据库 . 在Naked Identity代码中,使用了Identity的v1.0 . 有些东西是不同的(例如一些表属性),但它大部分都是相同的 . 要创建Identity可用的数据库,我只需运行模板MVC 5项目,为使用Code First方法创建的表注册用户,然后在我的空数据库中复制Identity所需的那些表 .

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

    基本上,需要这两个连接字符串,因为,Identity将使用默认值,而.edmx将使用另一个 . 由于.edmx连接字符串需要元数据,身份不支持,因此不可能同时使用相同的一个 . 因此,这两个连接字符串是不同的,但我修改它们,以便它们可以引用相同的数据库 .

    <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的初始化方式:

    ``public class 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") { } }

    希望这将有助于那些想要使用身份的模型优先方法的人 .

相关问题