无法使用 Identity ApplicationUserManager 创建新的
Cannot create new using Identity ApplicationUserManager
简而言之,我收到的错误消息是:
System.Data.SqlClient.SqlException: 对象名称无效“*NowDeletedDatabase*.dbo._SharedIdentity_UserIds”。
这是抛出它的代码:
[HttpPost]
[Authorize(Roles = "Admin, SuperAdmin")]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(Edit model)
{
if (!ModelState.IsValid) return View(model);
var user = new ApplicationUser()
{
UserName = model.Email,
Email = model.Email,
FirstName = model.FirstName,
LastName = model.LastName,
PhoneNumber = model.PhoneNumber
};
var result = _userManager.Create(user, model.Password);
if (result.Succeeded)
{
_userManager.Update(user);
await _userManager.SendEmailAsync(user.Id, "Account Details", "email body text");
}
else
{
AddErrors(result);
return View(model);
}
return RedirectToAction("UserList", "Account");
}
当我调用 _userManager.Create 时抛出上述错误(无论我调用 CreateAsync 还是尝试使用我的 IdentityDbContext .add() .saveChanges() 方法直接保存到数据库都没有关系)。
我查看了我的代码并搜索了 *NowDeletedDatabase* (ctrl+f Entire Solution),但我的代码中没有对这个数据库的引用,所以我对这个引用的方式感到困惑正在呼叫。
此外值得注意的是,在此项目的其他地方,我可以编辑已经存在的用户并通过 _userManager.Update(user) 保存更改;这运行没有问题。
最后,值得一提的是,身份曾经存在于这个 *NowDeletedDatabase* 数据库中,然后被拆分到它自己的数据库以及与其一起实施的项目中。代码在我进行的过程中被复制粘贴,我开始认为这可能是我出现问题的根本原因;然而,在我的代码中找不到对这个旧数据库的引用并简单地将其替换为正确的细节,这似乎仍然很疯狂。
更新
配置文件中的相关部分:
网络配置
</p>
<pre><code><configuration>
<connectionStrings>
<add name="sharedIdentityConnection" connectionString="Data Source=localhost;Initial Catalog=Shared_Identity;Integrated Security=SSPI;" providerName="System.Data.SqlClient" />
</connectionStrings>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="mssqllocaldb" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
</configuration>
应用程序配置:
</p>
<pre><code><configuration>
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<connectionStrings>
</connectionStrings>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="mssqllocaldb" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
</configuration>
抱歉格式混乱。
除非我误解了这些连接字符串,否则它们中的 3 个都应该查看我的本地主机,其中 1 个明确针对正确的数据库,而另外两个只是针对服务器进行了身份验证。但是据我了解,我的库 class 无论如何都会使用 web.config 文件中指定的连接字符串。
更新 2
我刚刚注意到 "SharedIdentity" 作为错误“'*NowDeletedDatabase*.dbo._SharedIdentity_UserIds'” 的一部分从来都不是数据库模式的一部分,我唯一需要 "SharedIdentity" 的相关参考是我的 lib 项目中的一个 class,此 class 继承了 IdentityDbContext 并且我可以确认此 class 中没有名为 UserIds 的 属性(继承或其他方式)。
原来我的 SQL 数据库在调用这个旧数据库的 ASPNETUsers table 上设置了触发器。因此错误。
删除不再需要的触发器解决了我的问题。
简而言之,我收到的错误消息是:
System.Data.SqlClient.SqlException: 对象名称无效“*NowDeletedDatabase*.dbo._SharedIdentity_UserIds”。
这是抛出它的代码:
[HttpPost]
[Authorize(Roles = "Admin, SuperAdmin")]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(Edit model)
{
if (!ModelState.IsValid) return View(model);
var user = new ApplicationUser()
{
UserName = model.Email,
Email = model.Email,
FirstName = model.FirstName,
LastName = model.LastName,
PhoneNumber = model.PhoneNumber
};
var result = _userManager.Create(user, model.Password);
if (result.Succeeded)
{
_userManager.Update(user);
await _userManager.SendEmailAsync(user.Id, "Account Details", "email body text");
}
else
{
AddErrors(result);
return View(model);
}
return RedirectToAction("UserList", "Account");
}
当我调用 _userManager.Create 时抛出上述错误(无论我调用 CreateAsync 还是尝试使用我的 IdentityDbContext .add() .saveChanges() 方法直接保存到数据库都没有关系)。
我查看了我的代码并搜索了 *NowDeletedDatabase* (ctrl+f Entire Solution),但我的代码中没有对这个数据库的引用,所以我对这个引用的方式感到困惑正在呼叫。
此外值得注意的是,在此项目的其他地方,我可以编辑已经存在的用户并通过 _userManager.Update(user) 保存更改;这运行没有问题。
最后,值得一提的是,身份曾经存在于这个 *NowDeletedDatabase* 数据库中,然后被拆分到它自己的数据库以及与其一起实施的项目中。代码在我进行的过程中被复制粘贴,我开始认为这可能是我出现问题的根本原因;然而,在我的代码中找不到对这个旧数据库的引用并简单地将其替换为正确的细节,这似乎仍然很疯狂。
更新
配置文件中的相关部分:
网络配置
</p>
<pre><code><configuration>
<connectionStrings>
<add name="sharedIdentityConnection" connectionString="Data Source=localhost;Initial Catalog=Shared_Identity;Integrated Security=SSPI;" providerName="System.Data.SqlClient" />
</connectionStrings>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="mssqllocaldb" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
</configuration>
应用程序配置:
</p>
<pre><code><configuration>
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<connectionStrings>
</connectionStrings>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="mssqllocaldb" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
</configuration>
抱歉格式混乱。
除非我误解了这些连接字符串,否则它们中的 3 个都应该查看我的本地主机,其中 1 个明确针对正确的数据库,而另外两个只是针对服务器进行了身份验证。但是据我了解,我的库 class 无论如何都会使用 web.config 文件中指定的连接字符串。
更新 2
我刚刚注意到 "SharedIdentity" 作为错误“'*NowDeletedDatabase*.dbo._SharedIdentity_UserIds'” 的一部分从来都不是数据库模式的一部分,我唯一需要 "SharedIdentity" 的相关参考是我的 lib 项目中的一个 class,此 class 继承了 IdentityDbContext 并且我可以确认此 class 中没有名为 UserIds 的 属性(继承或其他方式)。
原来我的 SQL 数据库在调用这个旧数据库的 ASPNETUsers table 上设置了触发器。因此错误。
删除不再需要的触发器解决了我的问题。