加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 22:23:17 所属栏目:百科 来源:网络整理
导读:我正在使用vs2013并使用asp.net mvc 5来创建我的Web应用程序.为了进行个人身份验证,我正在使用Identity 2.0. 当我创建我的Entitymodel.edmx时,它会在web.config中自动为我的数据库生成新的连接字符串,如下所示: add name="myEntities" connectionString="me
我正在使用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:usersmohamaddocumentsvisual studio 2013ProjectsShopShopApp_DataShop.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处理现有数据库的首选方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读