【问题标题】:Connect ASP.net Identity 2.0 to an already existed database将 ASP.net Identity 2.0 连接到已经存在的数据库
【发布时间】:2015-11-23 18:42:56
【问题描述】:

我正在使用 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" />

我想 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" />

因此,当我第一次运行项目时,它会创建名为

的新 .mdf 文件

aspnet-testauthentication-20151116011628.mdf

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

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

但我收到以下错误:

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

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

非常感谢

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

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

为什么当里面有数据库甚至表的时候,identity会尝试创建数据库??

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

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

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

如果您需要在 Identity 的现有属性(例如 name、City 和 ...)之外添加其他属性。请执行以下步骤并运行项目并注册:

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

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

  2. 在AccountViewModel.csRegisterViewModelclass 中添加完全相同的属性并分配它们的属性,如[Requierd]
  3. 在AccountController.cs 在Register 操作中添加如下属性:

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

  4. 在注册视图中添加相关的html

干杯

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-identity asp.net-identity-2


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 在 asp.net 中有另一个项目(不是 mvc),我使用 Identity for Authentication 并且我只是设置了连接:UserStore&lt;IdentityUser&gt; userStore = new UserStore&lt;IdentityUser&gt;(); userStore.Context.Database.Connection.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; 和身份生成表到我的数据库。我只希望它们在我现有的数据库中而不是在 .edmx 模型中,我相信应该有办法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    相关资源
    最近更新 更多