Tôi biết đây là một bài viết cũ, nhưng hôm nay tôi gặp vấn đề tương tự và đã điều tra một chút về vấn đề này, đồng thời muốn chia sẻ những phát hiện và giải pháp của tôi.
Vấn đề là Microsoft giữa các phiên bản đã thêm một chỉ mục duy nhất vào Name
cột của AspNetRoles
và vì cột này có kích thước 256 nên nó phá vỡ các quy tắc chỉ mục của MySql. Sự cố này cũng sẽ xảy ra trên Name
trên AspNetUsers
.
Vì vậy, tôi đã đi phân tích cách khắc phục điều này và tôi nghĩ rằng cách đúng nhất cần làm là giảm độ dài của Name
(IMHO thực sự không có lý do gì để có một vai trò / người dùng với một cái tên dài như vậy).
Sau khi điều tra mã trên IdentityDbContext (là lớp cơ sở), tôi nghĩ rằng giải pháp chính xác nhất cho vấn đề này là ghi đè OnModelCreating
trong ApplicationDbContext
và điều chỉnh kích thước cột ở đó như sau:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
//... default code for ApplicationDbContext
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
if (modelBuilder == null)
{
throw new ArgumentNullException("modelBuilder");
}
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<ApplicationUser>().Property(u => u.UserName).HasMaxLength(128);
//Uncomment this to have Email length 128 too (not neccessary)
//modelBuilder.Entity<ApplicationUser>().Property(u => u.Email).HasMaxLength(128);
modelBuilder.Entity<IdentityRole>().Property(r => r.Name).HasMaxLength(128);
}
}
Mã này sẽ khởi tạo mô hình nhận dạng với cấu hình mặc định với base.OnModelCreating
gọi và sau đó ghi đè các cài đặt được thực hiện trong lớp cơ sở bằng cài đặt của riêng chúng tôi.
Vì bạn đang tạo dự án di chuyển, bạn sẽ cần chạy lại quá trình tạo di chuyển để nhận mô hình được cập nhật (hoặc sửa đổi mô hình của bạn theo cách thủ công để điều chỉnh kích thước cột).
Điều này sẽ giải quyết được vấn đề và bạn sẽ có đầy đủ chức năng của hệ thống Nhận dạng Asp.NET.
Tất nhiên để không gặp bất kỳ lỗi nào khi tạo dự án, bạn chỉ có thể sửa đổi mã di chuyển của mình, nhưng sau đó bạn sẽ có sự khác biệt với mô hình được xác định bởi ngữ cảnh của bạn, điều này không tốt và có thể gây ra sự cố.