ASP.NET MVC4实体验证错误:用户名已被占用

本文关键字:用户 MVC4 NET 实体 验证 错误 ASP | 更新日期: 2023-09-27 17:57:29

我是ASP的新手。NET MVC4,在下面的代码上得到一个验证错误。

我的应用程序正在使用身份和数据库。

我有一些表填充了一些测试数据。对dc.SaveChanges()的调用返回Validation错误。

我创建了以下类:Faculty派生自类Person派生自类IdentityUser

我创建了一个名为Faculty的角色,然后创建了名为markFaculty对象,并将其添加为Faculty角色。当mark登录并且数据库开始初始化时,我得到错误"User name Peter is already taken."

如有解释,不胜感激。

代码

Person:类

public class Faculty : Person {
    public Faculty() {
        this.Courses = new List<Course>();
        SenecaId = string.Empty;
    }
    public Faculty(string fname, string lname, string phone, string senId)
        : base(fname, lname, phone) {
        this.Courses = new List<Course>();
        this.Messages = new List<Message>();
        SenecaId = senId;
    }
    [Required]
    [RegularExpression("^[0][0-9]{8}$", ErrorMessage = "0 followed by 8 digits")]
    public string SenecaId { get; set; }
    public List<Course> Courses { get; set; }
    public List<Message> Messages { get; set; }
}

IdentityUser:类

public class Person : IdentityUser {
    public Person() {
      FirstName = LastName = Phone = string.Empty;
    }
    public Person(string f, string l, string p) {
      FirstName = f;
      LastName = l;
      Phone = p;
    }
    [Key]
    public int PersonId { get; set; }
    [Required]
    [StringLength(40, MinimumLength = 3)]
    [Display(Name = "First Name")]
    public string FirstName { get; set; }
    [Required]
    [StringLength(100, MinimumLength = 3)]
    [Display(Name = "Last Name")]
    public string LastName { get; set; }
    [Required]
    [RegularExpression("^[2-9]''d{2}-''d{3}-''d{4}$", ErrorMessage = "nnn-nnn-nnnn")]
    public string Phone { get; set; }
}

角色Faculty:

string roleFaculty = "Faculty";
if (!RoleManager.RoleExists(roleFaculty)) {
    var roleFacultyCreateResult = RoleManager.Create(new IdentityRole(roleFaculty));
}

创建Faculty对象(标记)并将其添加到角色Faculty:

// 1 create faculty Mark (8)
Faculty mark = new Faculty();
// add "mark" to role "faculty"
mark.SenecaId = "034234678";
mark.FirstName = "Mark";
mark.LastName = "McTest";
mark.Phone = "555-567-6789";
mark.UserName = "Mark";
string UserMarkPw = "123456";
var UserMarkCreate = UserManager.Create(mark, UserMarkPw);
if (UserMarkCreate.Succeeded) {
    var addUserMarkToRoleFacultyResult = UserManager.AddToRole(mark.Id, roleFaculty);
}
mark.HomeTown = "Markham";
var UserMarkInfo = new MyUserInfo() { 
    FirstName = "Mark", LastName = "McTest" };
mark.MyUserInfo = UserMarkInfo;
mark.PersonId = 8;
dc.Faculties.Add(mark);  

错误:

"Entity of type Faculty in state Added has the following validation errors:"
...
"User name Peter is already taken."

ASP.NET MVC4实体验证错误:用户名已被占用

您已经绑定了它们那是你的问题。IdentityUser用户帐户,因为FacultyPersonIdentityUser,所以FacultyIdentityUser。通过创建Faculty对象,您也创建了一个用户帐户。

事实上,除非您自定义了实体配置,否则EntityFramework会在带有鉴别器列的AspNetUsers表中执行所有这些操作。换句话说,您没有实际的Faculty表或Persons表,而是一个AspNetUsers表,其中一列填充了特定类类型的名称("Faculty"、"Person"等)

更新

标识只支持一种用户类型。您可以指定在应用程序上下文中继承的IdentityDbContext<>泛型的类型。在您的情况下,您已将其设置为Person(即IndentityDbContext<Person>)。也就是说,ApplicationUser根本没有被利用。如果这是你想要的,那没关系。你的"用户"可以按照你的喜好命名;它不必是CCD_ 27。然后,您只使用STI(单表继承)来添加一个更具体的"类型"用户,即Faculty类。对于基类是实体(映射到数据库表)的继承结构,EntityFramework默认情况下会这样做。基本上,FacultyPersonIdentityUser的所有字段都映射到同一个数据库表,并添加了一个鉴别器列来跟踪实体框架从数据库中提取该行时应该实例化的特定类类型。STI是一种常见的继承策略,用于将对象层次结构映射到关系数据库,在大多数情况下它运行良好,但您需要记住,超类上的所有字段都必须为null。换句话说,Faculty上的字段在数据库级别不能为NOT NULL,否则会出现错误。但是,您可以通过应用程序使字段成为必需字段,即使从技术上讲,在数据库级别不需要插入新行。

您可能会收到错误"用户名标记已被占用"因为用户名为'Mark'的用户是用以下语句创建并保存在数据库中的。

var UserMarkCreate = UserManager.Create(mark, UserMarkPw);

您再次尝试使用语句dc.Faculties.Add(mark)dc中添加'Mark'

现在,当您执行dc.SaveChanges()时,它再次尝试在DB中插入'Mark'。因此,你得到了错误,

"用户名标记已被占用。"