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

我正在使用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使用代码优先方法来生成mak数据库并连接到另一个连接字符串(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)
{
}

但我得到以下错误:

The entity type ApplicationUser is not part of the model for the
current context.

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

非常感谢

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

Cannot create file ‘c:\users\mohamad\documents\visual studio 2013\Projects\Shop\Shop\App_Data\Shop.mdf’ because it already exists. Change the file path or the file name, and retry the operation.
CREATE DATABASE failed. Some file names listed could not be created.

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

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

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

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

如果您需要添加一些其他属性以及Identity的现有属性,如name,City和….执行以下步骤并运行项目并注册:

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

公共类ApplicationUser:IdentityUser
    {
            public string Adress {get;组; }
            public DateTime DateOfBirth {get;组; }
            ….
    }
>在RegisterViewModelclass中的AccountViewModel.cs中添加完全相同的属性并分配其属性,如[Requierd]
>在Register action中的AccountController.cs中添加如下属性:

var user = new ApplicationUser(){UserName = model.Email,Email = model.Email,Adress = model.Adress};
>将相关的html添加到Register视图

干杯

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

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

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

此外,为了它的价值,你应该避免在这一点上使用EDMX.它已被弃用,并且将从EF7中删除对它的所有支持. EF团队承诺暂时继续支持EF6安全补丁和漏洞修复,但你仍然只是推迟了不可避免的事情.尽管名称看似矛盾,但Code First可以与现有数据库一起使用,这绝对是使用EF处理现有数据库的首选方法.

点赞