将 ASP.net Identity 2.0 连接到已经存在的数据库

Moh*_*oon 5 c# asp.net asp.net-mvc asp.net-identity asp.net-identity-2

我正在使用 vs2013 并使用 asp.net mvc 5 创建我的 Web 应用程序。为了进行个人身份验证,我正在使用Identity 2.0
当我创建我的 Entitymodel.edmx 时,它会自动在 web.config 中为我的数据库生成新的连接字符串,如下所示:

<add name="myEntities" connectionString="metadata=res://*/Models.mEntity.csdl|res://*/Models.mEntity.ssdl|res://*/Models.mEntity.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=(LocalDB)\v11.0;attachdbfilename=|DataDirectory|\Shop.mdf;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
Run Code Online (Sandbox Code Playgroud)

我想Identity使用代码优先方法来创建数据库并连接到另一个连接字符串(DefaultConnection),例如:

<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-testauthentication-20151116011628.mdf;Initial Catalog=aspnet-testauthentication-20151116011628;Integrated Security=True"
      providerName="System.Data.SqlClient" />
Run Code Online (Sandbox Code Playgroud)

因此,当我第一次运行项目时,它会创建新的.mdf文件,名称为

aspnet-testauthentication-20151116011628.mdf

并在其中创建表。但我想要的是让Identity连接到我已经创建的名为 : Shop.mdf 的数据库并在其中创建它的表。所以我把我的连接字符串名称ApplicationDbContext放在 IdentityModel.cs 的类中,如下所示:

public ApplicationDbContext()
        : base("myEntities", throwIfV1Schema: false)
{
}
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误:

实体类型 ApplicationUser 不是当前上下文模型的一部分。

那么这样做的适当和正确的方法是什么?

多谢

更新:
我在现有数据库和DefaultConnection 中使用完全相同的名称创建了 Identity 表以连接到现有数据库,现在我收到此错误:

无法创建文件 'c:\users\mohamad\documents\visual studio 2013\Projects\Shop\Shop\App_Data\Shop.mdf',因为它已经存在。更改文件路径或文件名,然后重试该操作。创建数据库失败。无法创建列出的某些文件名。

为什么当有数据库甚至表时,身份尝试创建数据库?

解决方案:
第 1 点:连接到现有数据库似乎身份没有问题,它可以很好地连接到它并在其上创建它的表。

第 2 点:我遇到的问题:我不知道问题的原因是什么,但我执行了以下步骤并解决了问题:

  1. 从 model.edmx 中删除所有表
  2. 删除模型.edmx
  3. 也重新生成 edmx 模型和连接字符串,然后我向其中添加了表
  4. DefalutConnection 字符串指向与实体连接字符串完全相同的 .mdf 文件。
  5. 运行项目并注册,一切顺利。
  6. 应填写连接字符串中的初始目录

如果除了身份的现有属性(如 name、City 和 ....)之外,您还需要添加一些其他属性,请执行以下步骤并运行项目并注册:

  1. IdentityModel.cs文件中将属性添加到ApplicationUser类中:

    public class ApplicationUser : IdentityUser { public string Adress { get; set; } public DateTime DateOfBirth { get; set; } .... }

  2. AccountViewModel.csRegisterViewModel类中添加完全相同的属性,并指定喜欢他们的属性[Requierd]
  3. AccountController.csRegister这样的操作添加属性:

    var user = new ApplicationUser() { UserName = model.Email, Email = model.Email ,Adress=model.Adress};

  4. 将相关的 html 添加到注册视图

干杯

Chr*_*att 1

你有两个选择。您可以让 Identity 占用使用 Code First 设置的单独数据库,然后通过第二个上下文使用现有数据库,或者您可以简单地在现有数据库中手动创建 Identity 需要的表。您将无法自动生成它们。

使用第一个选项,您将无法在任何身份实体和源自现有数据库的实体之间创建关系,即没有导航属性,也没有外键。不过,您仍然可以将用户 ID 存储在标准列中,然后手动使用它从 Identity 上下文中查找适当的用户。

使用第二个选项,您只需要知道需要创建哪些表。为此,您可以允许通过 Code First 生成表,然后只需将架构移至现有数据库,然后删除特定于身份的上下文并更新 EDMX。

另外,无论如何,您此时应该避免使用 EDMX。它已被弃用,并且所有对它的支持都将从 EF7 中删除。EF 团队已承诺暂时继续通过安全补丁和错误修复来支持 EF6,但您仍然只是在推迟不可避免的事情。尽管名称看似矛盾,但 Code First可以与现有数据库一起使用,这绝对是通过 EF 处理现有数据库的首选方法。