Entity Framework Code First 및 MVC 5로 작업하고 있습니다. 개별 사용자 계정 인증을 사용 하여 응용 프로그램을 만들었을 때 계정 컨트롤러와 함께 Indiv 사용자 계정 인증이 작동하는 데 필요한 모든 필수 클래스 및 코드가 제공되었습니다. .
이미 적용된 코드는 다음과 같습니다.
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext() : base("DXContext", throwIfV1Schema: false)
{
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
}
하지만 그런 다음 먼저 코드를 사용하여 내 컨텍스트를 만들었으므로 이제 다음과 같이합니다.
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; }
}
마지막으로 개발하는 동안 작업 할 데이터를 추가하는 다음과 같은 시드 방법이 있습니다.
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);
}
}
}
}
내 솔루션은 잘 빌드되지만 데이터베이스에 액세스해야하는 컨트롤러에 액세스하려고하면 다음 오류가 발생합니다.
DX.DOMAIN.Context.IdentityUserLogin : : EntityType 'IdentityUserLogin'에 정의 된 키가 없습니다. 이 EntityType에 대한 키를 정의하십시오.
DX.DOMAIN.Context.IdentityUserRole : : EntityType 'IdentityUserRole'에 정의 된 키가 없습니다. 이 EntityType에 대한 키를 정의하십시오.
내가 뭘 잘못하고 있죠? 두 가지 컨텍스트가 있기 때문입니까?
최신 정보
Augusto의 답변을 읽은 후 옵션 3 을 선택했습니다 . 내 DXContext 클래스는 다음과 같습니다.
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();
}
}
또한 a User.cs
및 Role.cs
클래스를 추가했는데 다음과 같습니다.
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; }
}
기본 ApplicationUser에는 해당 필드와 다른 필드가 있기 때문에 사용자에 대한 암호 속성이 필요한지 확실하지 않았습니다!
어쨌든 위의 변경 사항은 잘 빌드되지만 응용 프로그램이 실행될 때 다시이 오류가 발생합니다.
잘못된 열 이름 UserId
UserId
내 정수 속성입니다 Artist.cs