Tôi đang làm việc với Entity Framework Code First và MVC 5. Khi tôi tạo ứng dụng của mình với Xác thực Tài khoản Người dùng Cá nhân, tôi đã được cấp một bộ điều khiển Tài khoản và cùng với nó là tất cả các lớp và mã bắt buộc cần thiết để xác thực Tài khoản Người dùng Indiv hoạt động .
Trong số các mã đã có là:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext() : base("DXContext", throwIfV1Schema: false)
{
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
}
Nhưng sau đó tôi đã tiếp tục và tạo ngữ cảnh của riêng mình bằng cách sử dụng mã trước, vì vậy bây giờ tôi cũng có những thứ sau:
public class DXContext : DbContext
{
public DXContext() : base("DXContext")
{
}
public DbSet<ApplicationUser> Users { get; set; }
public DbSet<IdentityRole> Roles { get; set; }
public DbSet<Artist> Artists { get; set; }
public DbSet<Paintings> Paintings { get; set; }
}
Cuối cùng, tôi có phương pháp hạt giống sau để thêm một số dữ liệu để tôi làm việc trong khi phát triển:
protected override void Seed(DXContext context)
{
try
{
if (!context.Roles.Any(r => r.Name == "Admin"))
{
var store = new RoleStore<IdentityRole>(context);
var manager = new RoleManager<IdentityRole>(store);
var role = new IdentityRole { Name = "Admin" };
manager.Create(role);
}
context.SaveChanges();
if (!context.Users.Any(u => u.UserName == "James"))
{
var store = new UserStore<ApplicationUser>(context);
var manager = new UserManager<ApplicationUser>(store);
var user = new ApplicationUser { UserName = "James" };
manager.Create(user, "ChangeAsap1@");
manager.AddToRole(user.Id, "Admin");
}
context.SaveChanges();
string userId = "";
userId = context.Users.FirstOrDefault().Id;
var artists = new List<Artist>
{
new Artist { FName = "Salvador", LName = "Dali", ImgURL = "http://i62.tinypic.com/ss8txxn.jpg", UrlFriendly = "salvador-dali", Verified = true, ApplicationUserId = userId },
};
artists.ForEach(a => context.Artists.Add(a));
context.SaveChanges();
var paintings = new List<Painting>
{
new Painting { Title = "The Persistence of Memory", ImgUrl = "http://i62.tinypic.com/xx8tssn.jpg", ArtistId = 1, Verified = true, ApplicationUserId = userId }
};
paintings.ForEach(p => context.Paintings.Add(p));
context.SaveChanges();
}
catch (DbEntityValidationException ex)
{
foreach (var validationErrors in ex.EntityValidationErrors)
{
foreach (var validationError in validationErrors.ValidationErrors)
{
Trace.TraceInformation("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);
}
}
}
}
Giải pháp của tôi xây dựng tốt, nhưng khi tôi thử và truy cập bộ điều khiển yêu cầu quyền truy cập vào cơ sở dữ liệu, tôi gặp lỗi sau:
DX.DOMAIN.Context.IdentityUserLogin:: EntityType 'IdentityUserLogin' không có khóa nào được xác định. Xác định khóa cho EntityType này.
DX.DOMAIN.Context.IdentityUserRole:: EntityType 'IdentityUserRole' không có khóa nào được xác định. Xác định khóa cho EntityType này.
Tôi đang làm gì sai? Có phải vì tôi có hai bối cảnh?
CẬP NHẬT
Sau khi đọc câu trả lời của Augusto, tôi đã chọn Phương án 3 . Đây là lớp DXContext của tôi bây giờ trông như thế nào:
public class DXContext : DbContext
{
public DXContext() : base("DXContext")
{
// remove default initializer
Database.SetInitializer<DXContext>(null);
Configuration.LazyLoadingEnabled = false;
Configuration.ProxyCreationEnabled = false;
}
public DbSet<User> Users { get; set; }
public DbSet<Role> Roles { get; set; }
public DbSet<Artist> Artists { get; set; }
public DbSet<Painting> Paintings { get; set; }
public static DXContext Create()
{
return new DXContext();
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<User>().ToTable("Users");
modelBuilder.Entity<Role>().ToTable("Roles");
}
public DbQuery<T> Query<T>() where T : class
{
return Set<T>().AsNoTracking();
}
}
Tôi cũng đã thêm một User.cs
và một Role.cs
lớp, chúng trông như thế này:
public class User
{
public int Id { get; set; }
public string FName { get; set; }
public string LName { get; set; }
}
public class Role
{
public int Id { set; get; }
public string Name { set; get; }
}
Tôi không chắc liệu mình có cần thuộc tính mật khẩu cho người dùng hay không, vì ApplicationUser mặc định có thuộc tính đó và một loạt các trường khác!
Tuy nhiên, thay đổi ở trên xây dựng tốt, nhưng một lần nữa tôi gặp lỗi này khi ứng dụng được chạy:
Tên cột không hợp lệ UserId
UserId
là một thuộc tính số nguyên trên của tôi Artist.cs