ASP.NET Identity Model First因重命名的AspNetUserRoles列而失败

时间:2014-07-16 07:51:32

标签: entity-framework asp.net-mvc-5 asp.net-identity ef-model-first asp.net-identity-2

和其他几个人一样,我试图实现ASP.NET Identity Model First。一旦你尝试,错误,气氛,搜索和解决,一切都很好。我想。

另见:

行动方案,总结:

  • 创建默认项目(MVC5)
  • 创建数据库
  • 更新web.config
  • 中的connectionstring
  • 运行网站,注册:表格已创建
  • 创建EF模型(edmx)
  • 导入身份表(到目前为止一切正常)
  • 修改xxx.Context.tt以继承IdentityDbContext
  • 生成数据库脚本(麻烦从这里开始)

我已经解决了出现的问题(直到最新一步)。为了完整起见,我将描述它们。

使用默认的身份上下文

一切正常:表格已创建,我可以注册并登录。然而,这不是我想要的情况:我想使用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上下文来完成其他任务。不是首选的解决方案,但可以接受。

  • 回滚所有内容
  • 从数据库导入身份表
  • (可选)通过Model First方法创建实体
  • 生成的数据库脚本

正常项目和快速健全性检查测试项目都与AspNetUserRoles表具有相同的问题。这是一个联结表,当在EF设计器中导入它时,一切正常。你不会看到它,因为它是一个多对多的关系,当检查AspNetRole和AspNetUser之间的关联时,它看起来不错。

设计师和制图细节:

Model First mapping OK

但是,在生成sql脚本时,EF会修改密钥。

设计师和制图细节:

enter image description here

生成的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之外,还有其他选择吗?

1 个答案:

答案 0 :(得分:0)

如果你在开始和db仍然是空的 我相信最简单的解决方法是:

  1. 创建EF模型(edmx)。
  2. 右键单击模型&#34;从模型生成数据库&#34;。
  3. 它将创建DDL文件(下面的代码段)
  4. 替换所有错误&#34; AspNetUsers_Id&#34;和#34; AspNetRoles_Id&#34;正确的价值观。
  5. 右键单击&#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

  6. 快乐的编码!