Jer*_*enW 5 entity-framework ef-model-first asp.net-mvc-5 asp.net-identity asp.net-identity-2
像其他几个一样,我试图实现ASP.NET Identity Model First.一旦你尝试,错误,气氛,搜索和解决,一切都很好.我想.
也可以看看:
行动方案,总结如下:
我已经解决了出现的问题(直到最新一步).为了完整起见,我将描述它们.
使用默认的标识上下文
一切正常:表格创建,我可以注册和登录.然而,这不是我想要的情况:我想使用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上下文来处理其他所有内容.不是首选的解决方案,但可以接受.
正常项目和快速健全性检查测试项目都与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
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
如果您一开始并且数据库仍然为空,我相信最简单的解决方法是:
右键单击“执行”。
对我有用。
-- Creating non-clustered index for FOREIGN KEY 'FK_AspNetUserRoles_AspNetUser'
CREATE INDEX [IX_FK_AspNetUserRoles_AspNetUser]
ON [dbo].[AspNetUserRoles]
([AspNetUsers_Id]); //replace for UserId
快乐编码!
| 归档时间: |
|
| 查看次数: |
3398 次 |
| 最近记录: |