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

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

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

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

我创建了一个名为IdentityUser的角色,然后创建了一个名为FacultyFaculty对象并将其添加为mark角色。当Faculty登录并且数据库开始初始化时,出现错误mark

一个解释将不胜感激。



类别"User name Peter is already taken."

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; }
}


类别Person

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; }
}


角色IdentityUser

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是用户帐户,因为FacultyPersonIdentityUser,所以FacultyIdentityUser。通过创建Faculty对象,您还创建了一个用户帐户。

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

更新

身份仅支持一种用户类型。您可以指定在应用程序上下文中从IdentityDbContext<>泛型继承的类型。就您而言,您已将其设置为Person(即IndentityDbContext<Person>)。这就是说,完全不使用ApplicationUser。如果那是您想要的,那很好。您的“用户”可以随意命名。它不必是ApplicationUser。然后,您仅使用STI(单表继承)来添加用户的更特定“类型”,这就是您的Faculty类。对于基类为实体(映射到数据库表)的继承结构,默认情况下,Entity Framework会执行此操作。基本上,FacultyPersonIdentityUser的所有字段都映射到同一数据库表,并且添加了一个鉴别符列以跟踪从数据库中提取该行时实体框架应实例化的特定类类型。 。 STI是一种常见的继承策略,用于将对象层次结构映射到关系数据库,并且在大多数情况下都可以正常工作,但是您需要记住,超类上的所有字段都必须为空。换句话说,Faculty上的字段在数据库级别上不能为非空,否则会出现错误。但是,即使在数据库级别上在技术上不需要插入新行,也可以通过应用程序将其设置为必填字段。

关于c# - ASP.NET MVC4实体验证错误:用户名已被使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22941693/

10-10 18:28