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

时间:2014-04-08 15:37:19

标签: c# asp.net asp.net-mvc asp.net-mvc-4 asp.net-identity

我是ASP.NET MVC4的新手,在下面的代码中获得验证错误。

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

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

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

我创建了一个名为Faculty的角色,然后创建了一个名为Faculty的{​​{1}}对象,并将其添加为mark角色。当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);  

2 个答案:

答案 0 :(得分:1)

你已经束缚了他们。 那是你的问题。 IdentityUser 用户帐户,因为FacultyPersonIdentityUserFacultyIdentityUser 。通过创建Faculty对象,您还创建了一个用户帐户。

实际上,除非您自定义实体配置,否则Entity Framework会在AspNetUsers表中使用discriminator列完成所有这些操作。换句话说,您没有实际的Faculty表或Persons表,但是一个带有列的AspNetUsers表填充了特定类类型的名称(“Faculty”,“Person”等)。

<强>更新

Identity仅支持一种用户类型。您可以在应用程序的上下文中指定从您继承的IdentityDbContext<>通用类型。在您的情况下,您已将其设置为Person(即IndentityDbContext<Person>)。这意味着,根本没有使用ApplicationUser。如果这就是你想要的那就没关系。您的“用户”可以任意命名;它不一定是ApplicationUser。然后,您只使用了STI(单表继承)来添加更具体的“类型”用户,这将是您的Faculty类。实体框架默认为继承结构执行此操作,其中基类是实体(映射到数据库表)。基本上FacultyPerson IdentityUser的所有字段都映射到同一个数据库表,并添加了一个鉴别器列来跟踪特定的类类型当从数据库中提取该行时,实体框架应该实例化。 STI是用于将对象层次结构映射到关系数据库的常见继承策略,并且在大多数情况下它运行良好,但您需要记住,超类上的所有字段必须可以为空。换句话说,您不能在Faculty上有一个在数据库级别为NOT NULL的字段,否则您将收到错误。但是,您可以通过应用程序创建所需的字段,即使从技术上讲,在数据库级别不需要插入新行。

答案 1 :(得分:1)

您可能收到错误“用户名Mark已被占用。” 因为用户名'标记'的用户已创建并保存在DB中,并带有以下语句。

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

您再次尝试在dc中使用声明dc.Faculties.Add(mark)添加'标记';

现在,当您执行dc.SaveChanges()时,它会再次尝试在数据库中插入'标记'。因此你得到错误,

  

“用户名Mark已被占用。”