【发布时间】:2017-05-04 05:50:25
【问题描述】:
我正在使用 ASP.NET MVC 5 创建一个 Web 应用程序。
为了我的应用,我创建了一个单独的“网站用户”类,如下所示:
public class WebsiteUser
{
public WebsiteUser()
{
this.Comments = new List<CommentEntityModel>();
}
public int Id { get; set; }
public string Name { get; set; }
public virtual ApplicationUser IdentityUser { get; set; }
public ICollection<CommentEntityModel> Comments { get; set; }
}
当我尝试在网站中注册新用户时出现问题。
我的注册操作如下所示
public async Task<ActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
var user = new ApplicationUser { UserName = model.Username, Email = model.Email };
var websiteUser = service.CreateWebsiteUser(user);
var result = await UserManager.CreateAsync(user, model.Password);
var websiteUserResult = service.RegisterWebsiteUser(websiteUser);
UserManager.AddToRole(user.Id, UserRoles.WebsiteUser.ToString());
if (result.Succeeded && websiteUserResult)
{
await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);
return RedirectToAction("Index", "Home");
}
AddErrors(result);
}
// If we got this far, something failed, redisplay form
return View(model);
}
几乎是 Identity 创建的默认行,除了这两行:
var websiteUser = service.CreateWebsiteUser(user);
var websiteUserResult = service.RegisterWebsiteUser(websiteUser);
我为他们提供的服务是这样的:
CreateWebsiteUser()
public WebsiteUser CreateWebsiteUser(ApplicationUser appuser)
{
var user = new WebsiteUser
{
Name = appuser.UserName,
IdentityUser = appuser
};
return user;
}
注册网站用户()
public bool RegisterWebsiteUser(WebsiteUser websiteUser)
{
try
{
this.context.WebsiteUsers.Add(new WebsiteUser {Name = websiteUser.Name, IdentityUser = websiteUser.IdentityUser});
this.context.SaveChanges();
return true;
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
我的问题是,每当我尝试注册一个新用户时,我都会在 this.context.SaveChanges() 行上得到一个异常,说 “一个带有名称的用户名|名称| 已存在”。
|Name| 基本上是 ASPNetUsers 表中 UserName 列的值。
我真的被卡住了,找不到解决方案。 (我什至无法理解为什么会发生这样的错误)
我的数据库结构对我来说似乎没问题,所以我猜问题出在其他地方。
我能想到的唯一解决方案是完全删除我自己的 User 类,并为默认的 ASP User 添加属性。
非常感谢任何帮助。
【问题讨论】:
-
您是否调试过代码以查看 websiteUser.Name 中的值。另外为什么要在插入时创建一个新的 WebsiteUser 实例:
this.context.WebsiteUsers.Add(new WebsiteUser {Name = websiteUser.Name, IdentityUser = websiteUser.IdentityUser})可以更改为this.context.WebsiteUsers.Add(websiteUser) -
正是因为我正在调试并想看看这是否会有所帮助:D
websiteUser.Name应该是这样,但它不会导致问题。如果我不设置我的网络用户的IdentityUser属性,我不会得到异常。因此,当我将 IdentityUser 分配给我的网站用户时,事情就搞砸了:( -
是 WebsiteUser.Name 和 IdentityUser,Name 冲突吗?
-
好吧,我猜 ASP.NET 是这么看的,尽管我无法想象他们为什么会有冲突。我的是 WebsiteUser.Name 而 ASP 是 IdentityUser.UserName 他们的名字不一样,WebsiteUser 和 IdentityUser 是数据库中的不同表....它们之间的唯一联系是网站用户持有对 IdentityUser 的引用。
-
你检查过 EF 生成的 SQL 吗?你也不应该抛出一个新的异常,你可以这样做
throw
标签: c# asp.net asp.net-mvc asp.net-identity