簡體   English   中英

ASP.NET MVC4 實體驗證錯誤:用戶名已被占用

[英]ASP.NET MVC4 entity validation errors: User name already taken

我是 ASP.NET MVC4 的新手,在下面的代碼中遇到驗證錯誤。

我的應用程序正在使用身份和數據庫。

我有一些表格填充了一些測試數據。 調用dc.SaveChanges()返回驗證錯誤。

我創建了以下類: 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對象( Mark )並將其添加到角色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是一個IdentityUserFaculty是一個IdentityUser 通過創建Faculty對象,您也創建了一個用戶帳戶。

事實上,除非您自定義實體配置,否則實體框架會在 AspNetUsers 表中使用鑒別器列完成所有這些操作。 換句話說,您沒有實際的 Faculty 表或 Persons 表,而是一個 AspNetUsers 表,其中一列填充了特定類類型的名稱(“Faculty”、“Person”等)。

更新

身份僅支持一種用戶類型。 您可以指定在應用程序上下文中繼承自IdentityDbContext<>泛型的類型。 在您的情況下,您已將其設置為Person (即IndentityDbContext<Person> )。 這意味着根本不使用ApplicationUser 如果這是你想要的,那很好。 您的“用戶”可以隨意命名; 它不必是ApplicationUser 然后,您只是使用 STI(單表繼承)來添加更具體的用戶“類型”,這將是您的Faculty類。 對於基類是實體(映射到數據庫表)的繼承結構,實體框架默認執行此操作。 基本上FacultyPersonIdentityUser的所有字段都映射到同一個數據庫表,並添加了一個鑒別器列來跟蹤從數據庫中提取該行時實體框架應實例化的特定類類型。 STI 是一種用於將對象層次結構映射到關系數據庫的常見繼承策略,並且在大多數情況下它運行良好,但您需要記住超類上的所有字段都必須可以為空。 換句話說,你不能在Faculty上有一個在數據庫級別不是 NULL 的字段,否則你會得到一個錯誤。 但是,您可以通過應用程序使該字段成為必需的,即使在數據庫級別從技術上講不需要插入新行。

您可能會收到錯誤“用戶名標記已被占用”。 因為用戶名“Mark”的用戶是通過以下語句創建並保存在數據庫中的。

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

您再次嘗試使用語句dc.Faculties.Add(mark)dc添加“Mark”

現在,當您執行dc.SaveChanges() ,它會再次嘗試在數據庫中插入“Mark” 因此你得到錯誤,

“用戶名Mark已被占用。”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM