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

5

我正在使用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 使用Code First方法创建数据库,并连接到另一个连接字符串(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" />

因此,当我第一次运行项目时,它会创建一个名为 aspnet-testauthentication-20151116011628.mdf 的新.mdf文件并在其中创建表。但我想让 Identity 连接到我已经创建的名为:Shop.mdf的数据库,并在其中创建它的表。因此,我将我的连接字符串名称放在 IdentityModel.cs 中的 ApplicationDbContext 类中,就像这样:

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

但我得到了以下错误:
实体类型ApplicationUser不是当前上下文模型的一部分。
那么做这件事情的适当和正确的方法是什么?
非常感谢
更新:我在现有数据库中使用相同的名称完全创建了身份表,将DefaultConnection连接到现有数据库,现在我收到了此错误:
无法创建文件“ c:\ users \ mohamad \ documents \ visual studio 2013 \ Projects \ Shop \ Shop \ App_Data \ Shop.mdf”,因为它已经存在。更改文件路径或文件名,然后重试操作。CREATE DATABASE failed.列出的一些文件名无法创建。
为什么在有数据库甚至其中一个表的情况下,标识都会尝试创建数据?
解决方案:
1点:看起来标识没有与连接到已经存在的数据库有问题,它可以很好地连接到它并在其上创建它的表。
2点:我遇到的问题:我不知道我的问题是什么,但我按照以下步骤执行,问题得到解决:
删除model.edmx中的所有表 删除model.edmx 重新生成edmx模型以及连接字符串,然后将表添加到其中 DefalutConnection字符串指向与Entity Connection字符串完全相同的.mdf文件。 运行项目并注册,一切都很好。 连接字符串中的“初始目录”应该填写
如果您需要除Identity的现有属性(如名称,城市等)之外添加其他属性,则执行以下步骤,然后运行项目并注册:
在IdentityModel.cs文件中将属性添加到ApplicationUser类: public class ApplicationUser:IdentityUser {     public string Adress {get;set;}     public DateTime DateOfBirth {get;set;}     .... } 在AccountViewModel.cs中,在RegisterViewModel类中添加完全相同的属性,并分配其属性,如[Requierd] 在AccountController.cs中,在Register操作中添加属性,例如:
var user = new ApplicationUser(){UserName=model.Email,Email=model.Email,Adress=model.Adress }; 添加与注册视图相关的HTML
干杯
1个回答

1
你有两个选择。你可以让Identity占用一个使用Code First设置的单独数据库,然后通过第二个上下文使用现有数据库;或者你可以在现有数据库中手动创建Identity需要的表。你将无法自动生成它们。
对于第一种选择,你将无法在Identity实体和来自现有数据库的实体之间创建关系,即没有导航属性和外键。你仍然可以将用户ID存储在标准列中,然后手动使用它来查找适当的用户。
对于第二种选择,你只需要知道需要创建哪些表。为此,你可以允许通过Code First生成表,然后将模式移动到现有数据库中,然后删除Identity特定上下文并更新EDMX。
另外,值得注意的是,你应该避免在这个时候使用EDMX。它已经被弃用,并且所有对它的支持都将从EF7中删除。EF团队承诺继续为EF6提供安全补丁和错误修复,但你仍然只是推迟了不可避免的结果。尽管名称似乎相互矛盾,但Code First确实可以与现有数据库一起使用,这绝对是处理带有EF的现有数据库的首选方法。

之前有一个 ASP.NET(非 MVC)项目,我使用 Identity 进行身份验证,在其中只需设置连接字符串:UserStore<IdentityUser> userStore = new UserStore<IdentityUser>(); userStore.Context.Database.Connection.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; 然后 Identity 会在我的数据库中生成表。我只想将它们放在现有的数据库中,而不是在 .edmx 模型中,我相信一定有办法。 - M.Armoun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接