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

Jer*_*enW 5 entity-framework ef-model-first asp.net-mvc-5 asp.net-identity 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);
Run Code Online (Sandbox Code Playgroud)

和ApplicationUserManager一起使用Model First上下文:

public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) 
{
    var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<CustomModelFirstDbContext>()));
Run Code Online (Sandbox Code Playgroud)

结果是:

'/'应用程序中的服务器错误.

实体类型ApplicationUser不是当前上下文的模型的一部分.

描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.

异常详细信息:System.InvalidOperationException:实体类型ApplicationUser不是当前上下文的模型的一部分.

来源错误:

在执行当前Web请求期间生成了未处理的异常.可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息.

堆栈跟踪:[InvalidOperationException:实体类型ApplicationUser不是当前上下文的模型的一部分.]

将"普通"连接字符串与自定义的Model First上下文一起使用

WebApplication1.dll中出现"System.Data.Entity.Infrastructure.UnintentionalCodeFirstException"类型的异常,但未在用户代码中处理

附加信息:如果在Code First模式下使用,则使用T4模板为Database First和Model First开发生成的代码可能无法正常工作.要继续使用Database First或Model First,请确保在执行应用程序的配置文件中指定了Entity Framework连接字符串.要使用从Database First或Model First生成的这些类,使用Code First添加任何其他配置,使用属性或DbModelBuilder API,然后删除引发此异常的代码.

所以,我认为我需要默认的Identity上下文来使用Identity,并使用自定义的Model First上下文来处理其他所有内容.不是首选的解决方案,但可以接受.

  • 滚回一切
  • 从数据库导入标识表
  • (可选)通过Model First方法创建实体
  • 生成的数据库脚本

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

设计师和制图细节:

模型第一映射OK

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

设计师和制图细节:

在此输入图像描述

生成的SQL脚本:

-- Creating table 'AspNetUserRoles'
CREATE TABLE [dbo].[AspNetUserRoles] (
[AspNetRoles_Id] nvarchar(128) NOT NULL,
[AspNetUsers_Id] nvarchar(128) NOT NULL
);
GO
Run Code Online (Sandbox Code Playgroud)

在EF中,您无法更改设计器中的映射名称(social.msdn.microsoft.com上的线程).

随后,使用最初创建的上下文创建新用户将失败,因为联结表包含错误的列:

'/'应用程序中的服务器错误.

列名称"UserId"无效.

列名称"UserId"无效.

列名称"UserId"无效.

列名称"RoleId"无效.

列名称"UserId"无效.

描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.

异常详细信息:System.Data.SqlClient.SqlException:无效的列名称'UserId'.列名称"UserId"无效.列名称"UserId"无效.列名称"RoleId"无效.列名称"UserId"无效.

来源错误:

第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

如果您一开始并且数据库仍然为空,我相信最简单的解决方法是:

  1. 创建 EF 模型 (edmx)。
  2. 右键单击模型“从模型生成数据库”。
  3. 它将创建 DDL 文件(下面的片段)
  4. 将所有错误的“AspNetUsers_Id”和“AspNetRoles_Id”替换为正确的值。
  5. 右键单击“执行”。

    对我有用。 -- Creating non-clustered index for FOREIGN KEY 'FK_AspNetUserRoles_AspNetUser' CREATE INDEX [IX_FK_AspNetUserRoles_AspNetUser] ON [dbo].[AspNetUserRoles] ([AspNetUsers_Id]); //replace for UserId

快乐编码!