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="data source=(LocalDB)\v11.0;attachdbfilename=|DataDirectory|\Shop.mdf;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" 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 点:我遇到的问题:我不知道问题的原因是什么,但我执行了以下步骤并解决了问题:
如果除了身份的现有属性(如 name、City 和 ....)之外,您还需要添加一些其他属性,请执行以下步骤并运行项目并注册:
在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 添加到注册视图
干杯
你有两个选择。您可以让 Identity 占用使用 Code First 设置的单独数据库,然后通过第二个上下文使用现有数据库,或者您可以简单地在现有数据库中手动创建 Identity 需要的表。您将无法自动生成它们。
使用第一个选项,您将无法在任何身份实体和源自现有数据库的实体之间创建关系,即没有导航属性,也没有外键。不过,您仍然可以将用户 ID 存储在标准列中,然后手动使用它从 Identity 上下文中查找适当的用户。
使用第二个选项,您只需要知道需要创建哪些表。为此,您可以允许通过 Code First 生成表,然后只需将架构移至现有数据库,然后删除特定于身份的上下文并更新 EDMX。
另外,无论如何,您此时应该避免使用 EDMX。它已被弃用,并且所有对它的支持都将从 EF7 中删除。EF 团队已承诺暂时继续通过安全补丁和错误修复来支持 EF6,但您仍然只是在推迟不可避免的事情。尽管名称看似矛盾,但 Code First可以与现有数据库一起使用,这绝对是通过 EF 处理现有数据库的首选方法。
| 归档时间: |
|
| 查看次数: |
1012 次 |
| 最近记录: |