当我创建我的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" />
我认为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实体和实体之间创建关系,即无导航属性和外键.您仍然可以将用户ID存储在标准列中,然后手动使用它来从Identity上下文中查找相应的用户.
使用第二个选项,您只需要知道需要创建哪些表.为此,您可以允许通过Code First生成表,然后只需将架构移动到现有数据库,然后再删除特定于Identity的上下文并更新EDMX.
此外,为了它的价值,你应该避免在这一点上使用EDMX.它已被弃用,并且将从EF7中删除对它的所有支持. EF团队承诺暂时继续支持EF6安全补丁和漏洞修复,但你仍然只是推迟了不可避免的事情.尽管名称看似矛盾,但Code First可以与现有数据库一起使用,这绝对是使用EF处理现有数据库的首选方法.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。