和其他几个人一样,我试图实现ASP.NET Identity Model First。一旦你尝试,错误,气氛,搜索和解决,一切都很好。我想。
另见:
行动方案,总结:
我已经解决了出现的问题(直到最新一步)。为了完整起见,我将描述它们。
使用默认的身份上下文
一切正常:表格已创建,我可以注册并登录。然而,这不是我想要的情况:我想使用Model First方法。
使用EF连接字符串
使用自定义的模型第一个上下文修改CreatePerOwinContext,使其使用我的Model First上下文:
public void ConfigureAuth(IAppBuilder app)
{
app.CreatePerOwinContext(CustomModelFirstDbContext.Create);
和ApplicationUserManager一起使用Model First上下文:
public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
{
var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<CustomModelFirstDbContext>()));
结果:
&#39; /&#39;中的服务器错误应用
实体类型ApplicationUser不是该模型的一部分 目前的背景。
描述:执行期间发生了未处理的异常 当前的网络请求。请查看堆栈跟踪了解更多信息 有关错误的信息以及它在代码中的起源。
异常详细信息:System.InvalidOperationException:实体类型 ApplicationUser不是当前上下文模型的一部分。
来源错误:
执行期间生成了未处理的异常 当前的网络请求。有关的来源和位置的信息 可以使用下面的异常堆栈跟踪来识别异常。
堆栈跟踪: [InvalidOperationException:实体类型ApplicationUser不是 当前背景的模型的一部分。]
使用&#34;正常&#34; connectionstring与自定义的Model First上下文
类型的例外 &#39; System.Data.Entity.Infrastructure.UnintentionalCodeFirstException&#39; 发生在WebApplication1.dll中但未在用户代码中处理
附加信息:使用T4模板生成的代码 如果,Database First和Model First开发可能无法正常工作 用于Code First模式。继续使用Database First或Model 首先确保指定了Entity Framework连接字符串 在执行应用程序的配置文件中。要使用这些类, 使用Code从Database First或Model First生成的 首先使用属性或添加任何其他配置 DbModelBuilder API然后删除抛出此代码的代码 异常。
所以,我认为我需要默认的Identity上下文来使用Identity,并使用自定义的Model First上下文来完成其他任务。不是首选的解决方案,但可以接受。
正常项目和快速健全性检查测试项目都与AspNetUserRoles表具有相同的问题。这是一个联结表,当在EF设计器中导入它时,一切正常。你不会看到它,因为它是一个多对多的关系,当检查AspNetRole和AspNetUser之间的关联时,它看起来不错。
设计师和制图细节:
但是,在生成sql脚本时,EF会修改密钥。
设计师和制图细节:
生成的SQL脚本:
-- Creating table 'AspNetUserRoles'
CREATE TABLE [dbo].[AspNetUserRoles] (
[AspNetRoles_Id] nvarchar(128) NOT NULL,
[AspNetUsers_Id] nvarchar(128) NOT NULL
);
GO
在EF中,您无法更改设计器中映射的名称(thread on social.msdn.microsoft.com)。
随后使用最初创建的上下文创建新用户将失败,因为联结表包含错误的列:
&#39; /&#39;中的服务器错误应用
列名称无效&#39; UserId&#39;。
列名称无效&#39; UserId&#39;。
列名称无效&#39; UserId&#39;。
列名称无效&#39; RoleId&#39;。
列名称无效&#39; UserId&#39;。
描述:执行期间发生了未处理的异常 当前的网络请求。请查看堆栈跟踪了解更多信息 有关错误的信息以及它在代码中的起源。
异常详细信息:System.Data.SqlClient.SqlException:列名称无效&#39; UserId&#39;。列名称无效&#39; UserId&#39;。列名称无效&#39; UserId&#39;。列名称无效&#39; RoleId&#39;。列名称无效&#39; UserId&#39;。
来源错误:
第89行:{
第90行:var user = new ApplicationUser(){UserName = model.Email,Email = model.Email};
第91行:IdentityResult结果=等待UserManager.CreateAsync(user,model.Password);
第92行:if(result.Succeeded)
第93行:{
解决方案是什么?除了尝试更改生成的脚本或转移到Code First之外,还有其他选择吗?
答案 0 :(得分:0)
如果你在开始和db仍然是空的 我相信最简单的解决方法是:
右键单击&#34;执行&#34;。
适合我。
-- Creating non-clustered index for FOREIGN KEY 'FK_AspNetUserRoles_AspNetUser'
CREATE INDEX [IX_FK_AspNetUserRoles_AspNetUser]
ON [dbo].[AspNetUserRoles]
([AspNetUsers_Id]); //replace for UserId
醇>
快乐的编码!