我是ASP的新手。NET MVC4,在下面的代码上得到一个验证错误。
我的应用程序正在使用身份和数据库。
我有一些表填充了一些测试数据。对dc.SaveChanges()
的调用返回Validation错误。
我创建了以下类:Faculty
派生自类Person
派生自类IdentityUser
。
我创建了一个名为Faculty
的角色,然后创建了名为mark
的Faculty
对象,并将其添加为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."
您已经绑定了它们那是你的问题。IdentityUser
是用户帐户,因为Faculty
是Person
是IdentityUser
,所以Faculty
是IdentityUser
。通过创建Faculty
对象,您也创建了一个用户帐户。
事实上,除非您自定义了实体配置,否则EntityFramework会在带有鉴别器列的AspNetUsers表中执行所有这些操作。换句话说,您没有实际的Faculty表或Persons表,而是一个AspNetUsers表,其中一列填充了特定类类型的名称("Faculty"、"Person"等)
更新
标识只支持一种用户类型。您可以指定在应用程序上下文中继承的IdentityDbContext<>
泛型的类型。在您的情况下,您已将其设置为Person
(即IndentityDbContext<Person>
)。也就是说,ApplicationUser
根本没有被利用。如果这是你想要的,那没关系。你的"用户"可以按照你的喜好命名;它不必是CCD_ 27。然后,您只使用STI(单表继承)来添加一个更具体的"类型"用户,即Faculty
类。对于基类是实体(映射到数据库表)的继承结构,EntityFramework默认情况下会这样做。基本上,Faculty
、Person
和IdentityUser
的所有字段都映射到同一个数据库表,并添加了一个鉴别器列来跟踪实体框架从数据库中提取该行时应该实例化的特定类类型。STI是一种常见的继承策略,用于将对象层次结构映射到关系数据库,在大多数情况下它运行良好,但您需要记住,超类上的所有字段都必须为null。换句话说,Faculty
上的字段在数据库级别不能为NOT NULL,否则会出现错误。但是,您可以通过应用程序使字段成为必需字段,即使从技术上讲,在数据库级别不需要插入新行。
您可能会收到错误"用户名标记已被占用"因为用户名为'Mark'的用户是用以下语句创建并保存在数据库中的。
var UserMarkCreate = UserManager.Create(mark, UserMarkPw);
您再次尝试使用语句dc.Faculties.Add(mark)
在dc
中添加'Mark';
现在,当您执行dc.SaveChanges()
时,它再次尝试在DB中插入'Mark'。因此,你得到了错误,
"用户名标记已被占用。"