C# EF代码第一个现有数据库-IdentityUser表问题
我对自定义用户有问题。 我有一个名为Profiles的表,用于我的users表(它不允许我使用users,但这是另一个问题!),我创建了dbcontext,如下所示:C# EF代码第一个现有数据库-IdentityUser表问题,c#,sql,entity-framework,asp.net-mvc-5,C#,Sql,Entity Framework,Asp.net Mvc 5,我对自定义用户有问题。 我有一个名为Profiles的表,用于我的users表(它不允许我使用users,但这是另一个问题!),我创建了dbcontext,如下所示: public partial class SkipstoneContext : IdentityDbContext<Profile> { static SkipstoneContext() { Database.SetInitializer<SkipstoneContext>
public partial class SkipstoneContext : IdentityDbContext<Profile>
{
static SkipstoneContext()
{
Database.SetInitializer<SkipstoneContext>(null); // Existing data, do nothing
}
public SkipstoneContext()
: base("DefaultConnection")
{
}
// ...
public DbSet<Company> Companies { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(model => model.UserId);
modelBuilder.Entity<IdentityRole>().HasKey<string>(model => model.Id);
modelBuilder.Entity<IdentityUserRole>().HasKey(model => new { model.RoleId, model.UserId });
modelBuilder.Entity<UserSecret>().HasKey<string>(model => model.UserName);
}
}
public partial class Profile : IdentityUser
{
public Profile()
{
// ...
}
public string CompanyId { get; set; }
public string Title { get; set; }
public string Forename { get; set; }
public string Surname { get; set; }
public string Email { get; set; }
// ...
public virtual Company Company { get; set; }
// ...
}
public partial class SkipstoneContext : DbContext // : IdentityDbContext<Profile>
{
static SkipstoneContext()
{
Database.SetInitializer<SkipstoneContext>(null); // Exsting database, do nothing
}
public SkipstoneContext()
: base("DefaultConnection")
{
}
// ...
public DbSet<Company> Companies { get; set; }
public DbSet<Profile> Profiles { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// ...
modelBuilder.Configurations.Add(new CompanyMap());
modelBuilder.Configurations.Add(new ProfileMap());
/// ...
//modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(model => model.UserId);
//modelBuilder.Entity<IdentityRole>().HasKey<string>(model => model.Id);
//modelBuilder.Entity<IdentityUserRole>().HasKey(model => new { model.RoleId, model.UserId });
//modelBuilder.Entity<UserSecret>().HasKey<string>(model => model.UserName);
}
}
public class ProfileMap : EntityTypeConfiguration<Profile>
{
public IdentityUserMap()
{
// Primary Key
this.HasKey(t => t.Id);
// Properties
this.Property(t => t.Id)
.IsRequired()
.HasMaxLength(128);
this.Property(t => t.CompanyId)
.IsRequired()
.HasMaxLength(128);
this.Property(t => t.CreatedById)
.IsRequired()
.HasMaxLength(128);
this.Property(t => t.ModifiedById)
.HasMaxLength(128);
this.Property(t => t.Title)
.IsRequired();
this.Property(t => t.Forename)
.IsRequired();
this.Property(t => t.Surname)
.IsRequired();
this.Property(t => t.Email)
.IsRequired();
this.Property(t => t.CredentialId)
.IsRequired();
this.Property(t => t.PasswordHash)
.HasMaxLength(128);
this.Property(t => t.SecurityStamp)
.HasMaxLength(128);
this.Property(t => t.Discriminator)
.HasMaxLength(128);
// Table & Column Mappings
this.ToTable("Profiles");
this.Property(t => t.Id).HasColumnName("Id");
this.Property(t => t.CompanyId).HasColumnName("CompanyId");
this.Property(t => t.CreatedById).HasColumnName("CreatedById");
this.Property(t => t.ModifiedById).HasColumnName("ModifiedById");
this.Property(t => t.DateCreated).HasColumnName("DateCreated");
this.Property(t => t.DateModified).HasColumnName("DateModified");
this.Property(t => t.LastLoginDate).HasColumnName("LastLoginDate");
this.Property(t => t.Title).HasColumnName("Title");
this.Property(t => t.Forename).HasColumnName("Forename");
this.Property(t => t.Surname).HasColumnName("Surname");
this.Property(t => t.Email).HasColumnName("Email");
this.Property(t => t.JobTitle).HasColumnName("JobTitle");
this.Property(t => t.Telephone).HasColumnName("Telephone");
this.Property(t => t.Mobile).HasColumnName("Mobile");
this.Property(t => t.Photo).HasColumnName("Photo");
this.Property(t => t.LinkedIn).HasColumnName("LinkedIn");
this.Property(t => t.Twitter).HasColumnName("Twitter");
this.Property(t => t.Facebook).HasColumnName("Facebook");
this.Property(t => t.Google).HasColumnName("Google");
this.Property(t => t.Bio).HasColumnName("Bio");
this.Property(t => t.CompanyName).HasColumnName("CompanyName");
this.Property(t => t.CredentialId).HasColumnName("CredentialId");
this.Property(t => t.IsLockedOut).HasColumnName("IsLockedOut");
this.Property(t => t.IsApproved).HasColumnName("IsApproved");
this.Property(t => t.CanEditOwn).HasColumnName("CanEditOwn");
this.Property(t => t.CanEdit).HasColumnName("CanEdit");
this.Property(t => t.CanDownload).HasColumnName("CanDownload");
this.Property(t => t.RequiresApproval).HasColumnName("RequiresApproval");
this.Property(t => t.CanApprove).HasColumnName("CanApprove");
this.Property(t => t.CanSync).HasColumnName("CanSync");
this.Property(t => t.AgreedTerms).HasColumnName("AgreedTerms");
this.Property(t => t.Deleted).HasColumnName("Deleted");
this.Property(t => t.UserName).HasColumnName("UserName");
this.Property(t => t.PasswordHash).HasColumnName("PasswordHash");
this.Property(t => t.SecurityStamp).HasColumnName("SecurityStamp");
this.Property(t => t.Discriminator).HasColumnName("Discriminator");
// Relationships
}
}
当我运行我的项目时,我得到一个错误
无效的对象名称“dbo.IdentityUsers”
如果我将表重命名为IdentityUsers并再次运行该项目,则会出现一个错误
无效的对象名称“dbo.Profiles”
这就是令人困惑的地方。看起来EF正在为用户寻找两个表,而不仅仅是一个
谁能给我解释一下原因吗
更新1
为了解决这个问题,我从SkipstoneContext中删除了继承的IdentityDbContent,而只是从DbContext中继承。
新的上下文类如下所示:
public partial class SkipstoneContext : IdentityDbContext<Profile>
{
static SkipstoneContext()
{
Database.SetInitializer<SkipstoneContext>(null); // Existing data, do nothing
}
public SkipstoneContext()
: base("DefaultConnection")
{
}
// ...
public DbSet<Company> Companies { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(model => model.UserId);
modelBuilder.Entity<IdentityRole>().HasKey<string>(model => model.Id);
modelBuilder.Entity<IdentityUserRole>().HasKey(model => new { model.RoleId, model.UserId });
modelBuilder.Entity<UserSecret>().HasKey<string>(model => model.UserName);
}
}
public partial class Profile : IdentityUser
{
public Profile()
{
// ...
}
public string CompanyId { get; set; }
public string Title { get; set; }
public string Forename { get; set; }
public string Surname { get; set; }
public string Email { get; set; }
// ...
public virtual Company Company { get; set; }
// ...
}
public partial class SkipstoneContext : DbContext // : IdentityDbContext<Profile>
{
static SkipstoneContext()
{
Database.SetInitializer<SkipstoneContext>(null); // Exsting database, do nothing
}
public SkipstoneContext()
: base("DefaultConnection")
{
}
// ...
public DbSet<Company> Companies { get; set; }
public DbSet<Profile> Profiles { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// ...
modelBuilder.Configurations.Add(new CompanyMap());
modelBuilder.Configurations.Add(new ProfileMap());
/// ...
//modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(model => model.UserId);
//modelBuilder.Entity<IdentityRole>().HasKey<string>(model => model.Id);
//modelBuilder.Entity<IdentityUserRole>().HasKey(model => new { model.RoleId, model.UserId });
//modelBuilder.Entity<UserSecret>().HasKey<string>(model => model.UserName);
}
}
public class ProfileMap : EntityTypeConfiguration<Profile>
{
public IdentityUserMap()
{
// Primary Key
this.HasKey(t => t.Id);
// Properties
this.Property(t => t.Id)
.IsRequired()
.HasMaxLength(128);
this.Property(t => t.CompanyId)
.IsRequired()
.HasMaxLength(128);
this.Property(t => t.CreatedById)
.IsRequired()
.HasMaxLength(128);
this.Property(t => t.ModifiedById)
.HasMaxLength(128);
this.Property(t => t.Title)
.IsRequired();
this.Property(t => t.Forename)
.IsRequired();
this.Property(t => t.Surname)
.IsRequired();
this.Property(t => t.Email)
.IsRequired();
this.Property(t => t.CredentialId)
.IsRequired();
this.Property(t => t.PasswordHash)
.HasMaxLength(128);
this.Property(t => t.SecurityStamp)
.HasMaxLength(128);
this.Property(t => t.Discriminator)
.HasMaxLength(128);
// Table & Column Mappings
this.ToTable("Profiles");
this.Property(t => t.Id).HasColumnName("Id");
this.Property(t => t.CompanyId).HasColumnName("CompanyId");
this.Property(t => t.CreatedById).HasColumnName("CreatedById");
this.Property(t => t.ModifiedById).HasColumnName("ModifiedById");
this.Property(t => t.DateCreated).HasColumnName("DateCreated");
this.Property(t => t.DateModified).HasColumnName("DateModified");
this.Property(t => t.LastLoginDate).HasColumnName("LastLoginDate");
this.Property(t => t.Title).HasColumnName("Title");
this.Property(t => t.Forename).HasColumnName("Forename");
this.Property(t => t.Surname).HasColumnName("Surname");
this.Property(t => t.Email).HasColumnName("Email");
this.Property(t => t.JobTitle).HasColumnName("JobTitle");
this.Property(t => t.Telephone).HasColumnName("Telephone");
this.Property(t => t.Mobile).HasColumnName("Mobile");
this.Property(t => t.Photo).HasColumnName("Photo");
this.Property(t => t.LinkedIn).HasColumnName("LinkedIn");
this.Property(t => t.Twitter).HasColumnName("Twitter");
this.Property(t => t.Facebook).HasColumnName("Facebook");
this.Property(t => t.Google).HasColumnName("Google");
this.Property(t => t.Bio).HasColumnName("Bio");
this.Property(t => t.CompanyName).HasColumnName("CompanyName");
this.Property(t => t.CredentialId).HasColumnName("CredentialId");
this.Property(t => t.IsLockedOut).HasColumnName("IsLockedOut");
this.Property(t => t.IsApproved).HasColumnName("IsApproved");
this.Property(t => t.CanEditOwn).HasColumnName("CanEditOwn");
this.Property(t => t.CanEdit).HasColumnName("CanEdit");
this.Property(t => t.CanDownload).HasColumnName("CanDownload");
this.Property(t => t.RequiresApproval).HasColumnName("RequiresApproval");
this.Property(t => t.CanApprove).HasColumnName("CanApprove");
this.Property(t => t.CanSync).HasColumnName("CanSync");
this.Property(t => t.AgreedTerms).HasColumnName("AgreedTerms");
this.Property(t => t.Deleted).HasColumnName("Deleted");
this.Property(t => t.UserName).HasColumnName("UserName");
this.Property(t => t.PasswordHash).HasColumnName("PasswordHash");
this.Property(t => t.SecurityStamp).HasColumnName("SecurityStamp");
this.Property(t => t.Discriminator).HasColumnName("Discriminator");
// Relationships
}
}
它有一个IdentityUser属性,我认为这就是导致我的问题的原因。我知道Profile继承了IdentityUser,但出于某种原因,它似乎认为它在另一个表中
因此,我的下一个任务是创建一个自定义用户登录名,看看是否可以让EF使用IdentityUserLogin的替代名好的,我解决了这个问题。这是由于我的映射。我的配置文件映射类如下所示:
public partial class SkipstoneContext : IdentityDbContext<Profile>
{
static SkipstoneContext()
{
Database.SetInitializer<SkipstoneContext>(null); // Existing data, do nothing
}
public SkipstoneContext()
: base("DefaultConnection")
{
}
// ...
public DbSet<Company> Companies { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(model => model.UserId);
modelBuilder.Entity<IdentityRole>().HasKey<string>(model => model.Id);
modelBuilder.Entity<IdentityUserRole>().HasKey(model => new { model.RoleId, model.UserId });
modelBuilder.Entity<UserSecret>().HasKey<string>(model => model.UserName);
}
}
public partial class Profile : IdentityUser
{
public Profile()
{
// ...
}
public string CompanyId { get; set; }
public string Title { get; set; }
public string Forename { get; set; }
public string Surname { get; set; }
public string Email { get; set; }
// ...
public virtual Company Company { get; set; }
// ...
}
public partial class SkipstoneContext : DbContext // : IdentityDbContext<Profile>
{
static SkipstoneContext()
{
Database.SetInitializer<SkipstoneContext>(null); // Exsting database, do nothing
}
public SkipstoneContext()
: base("DefaultConnection")
{
}
// ...
public DbSet<Company> Companies { get; set; }
public DbSet<Profile> Profiles { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// ...
modelBuilder.Configurations.Add(new CompanyMap());
modelBuilder.Configurations.Add(new ProfileMap());
/// ...
//modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(model => model.UserId);
//modelBuilder.Entity<IdentityRole>().HasKey<string>(model => model.Id);
//modelBuilder.Entity<IdentityUserRole>().HasKey(model => new { model.RoleId, model.UserId });
//modelBuilder.Entity<UserSecret>().HasKey<string>(model => model.UserName);
}
}
public class ProfileMap : EntityTypeConfiguration<Profile>
{
public IdentityUserMap()
{
// Primary Key
this.HasKey(t => t.Id);
// Properties
this.Property(t => t.Id)
.IsRequired()
.HasMaxLength(128);
this.Property(t => t.CompanyId)
.IsRequired()
.HasMaxLength(128);
this.Property(t => t.CreatedById)
.IsRequired()
.HasMaxLength(128);
this.Property(t => t.ModifiedById)
.HasMaxLength(128);
this.Property(t => t.Title)
.IsRequired();
this.Property(t => t.Forename)
.IsRequired();
this.Property(t => t.Surname)
.IsRequired();
this.Property(t => t.Email)
.IsRequired();
this.Property(t => t.CredentialId)
.IsRequired();
this.Property(t => t.PasswordHash)
.HasMaxLength(128);
this.Property(t => t.SecurityStamp)
.HasMaxLength(128);
this.Property(t => t.Discriminator)
.HasMaxLength(128);
// Table & Column Mappings
this.ToTable("Profiles");
this.Property(t => t.Id).HasColumnName("Id");
this.Property(t => t.CompanyId).HasColumnName("CompanyId");
this.Property(t => t.CreatedById).HasColumnName("CreatedById");
this.Property(t => t.ModifiedById).HasColumnName("ModifiedById");
this.Property(t => t.DateCreated).HasColumnName("DateCreated");
this.Property(t => t.DateModified).HasColumnName("DateModified");
this.Property(t => t.LastLoginDate).HasColumnName("LastLoginDate");
this.Property(t => t.Title).HasColumnName("Title");
this.Property(t => t.Forename).HasColumnName("Forename");
this.Property(t => t.Surname).HasColumnName("Surname");
this.Property(t => t.Email).HasColumnName("Email");
this.Property(t => t.JobTitle).HasColumnName("JobTitle");
this.Property(t => t.Telephone).HasColumnName("Telephone");
this.Property(t => t.Mobile).HasColumnName("Mobile");
this.Property(t => t.Photo).HasColumnName("Photo");
this.Property(t => t.LinkedIn).HasColumnName("LinkedIn");
this.Property(t => t.Twitter).HasColumnName("Twitter");
this.Property(t => t.Facebook).HasColumnName("Facebook");
this.Property(t => t.Google).HasColumnName("Google");
this.Property(t => t.Bio).HasColumnName("Bio");
this.Property(t => t.CompanyName).HasColumnName("CompanyName");
this.Property(t => t.CredentialId).HasColumnName("CredentialId");
this.Property(t => t.IsLockedOut).HasColumnName("IsLockedOut");
this.Property(t => t.IsApproved).HasColumnName("IsApproved");
this.Property(t => t.CanEditOwn).HasColumnName("CanEditOwn");
this.Property(t => t.CanEdit).HasColumnName("CanEdit");
this.Property(t => t.CanDownload).HasColumnName("CanDownload");
this.Property(t => t.RequiresApproval).HasColumnName("RequiresApproval");
this.Property(t => t.CanApprove).HasColumnName("CanApprove");
this.Property(t => t.CanSync).HasColumnName("CanSync");
this.Property(t => t.AgreedTerms).HasColumnName("AgreedTerms");
this.Property(t => t.Deleted).HasColumnName("Deleted");
this.Property(t => t.UserName).HasColumnName("UserName");
this.Property(t => t.PasswordHash).HasColumnName("PasswordHash");
this.Property(t => t.SecurityStamp).HasColumnName("SecurityStamp");
this.Property(t => t.Discriminator).HasColumnName("Discriminator");
// Relationships
}
}
公共类概要映射:EntityTypeConfiguration
{
公共标识YUserMap()
{
//主键
this.HasKey(t=>t.Id);
//性质
this.Property(t=>t.Id)
.IsRequired()
.HasMaxLength(128);
this.Property(t=>t.CompanyId)
.IsRequired()
.HasMaxLength(128);
this.Property(t=>t.CreatedById)
.IsRequired()
.HasMaxLength(128);
this.Property(t=>t.ModifiedById)
.HasMaxLength(128);
this.Property(t=>t.Title)
.IsRequired();
this.Property(t=>t.Forename)
.IsRequired();
this.Property(t=>t.姓氏)
.IsRequired();
this.Property(t=>t.Email)
.IsRequired();
this.Property(t=>t.CredentialId)
.IsRequired();
this.Property(t=>t.PasswordHash)
.HasMaxLength(128);
this.Property(t=>t.SecurityStamp)
.HasMaxLength(128);
this.Property(t=>t.Discriminator)
.HasMaxLength(128);
//表和列映射
本表为ToTable(“配置文件”);
this.Property(t=>t.Id).HasColumnName(“Id”);
this.Property(t=>t.CompanyId).HasColumnName(“CompanyId”);
this.Property(t=>t.CreatedById).HasColumnName(“CreatedById”);
this.Property(t=>t.ModifiedById).HasColumnName(“ModifiedById”);
this.Property(t=>t.DateCreated).HasColumnName(“DateCreated”);
this.Property(t=>t.DateModified).HasColumnName(“DateModified”);
this.Property(t=>t.LastLoginDate).HasColumnName(“LastLoginDate”);
this.Property(t=>t.Title).HasColumnName(“Title”);
this.Property(t=>t.Forename).HasColumnName(“Forename”);
this.Property(t=>t.姓氏).HasColumnName(“姓氏”);
this.Property(t=>t.Email).HasColumnName(“Email”);
this.Property(t=>t.JobTitle).HasColumnName(“JobTitle”);
this.Property(t=>t.Telephone).HasColumnName(“电话”);
this.Property(t=>t.Mobile).HasColumnName(“Mobile”);
this.Property(t=>t.Photo).HasColumnName(“Photo”);
this.Property(t=>t.LinkedIn).HasColumnName(“LinkedIn”);
this.Property(t=>t.Twitter).HasColumnName(“Twitter”);
this.Property(t=>t.Facebook).HasColumnName(“Facebook”);
this.Property(t=>t.Google).HasColumnName(“Google”);
this.Property(t=>t.Bio).HasColumnName(“Bio”);
this.Property(t=>t.CompanyName).HasColumnName(“CompanyName”);
this.Property(t=>t.CredentialId).HasColumnName(“CredentialId”);
this.Property(t=>t.IsLockedOut).HasColumnName(“IsLockedOut”);
this.Property(t=>t.IsApproved).HasColumnName(“IsApproved”);
this.Property(t=>t.CanEditOwn).HasColumnName(“CanEditOwn”);
this.Property(t=>t.CanEdit).HasColumnName(“CanEdit”);
this.Property(t=>t.CanDownload).HasColumnName(“CanDownload”);
this.Property(t=>t.RequiresApproval).HasColumnName(“RequiresApproval”);
this.Property(t=>t.CanApprove).HasColumnName(“CanApprove”);
this.Property(t=>t.CanSync).HasColumnName(“CanSync”);
this.Property(t=>t.AgreedTerms).HasColumnName(“AgreedTerms”);
this.Property(t=>t.Deleted).HasColumnName(“Deleted”);
this.Property(t=>t.UserName).HasColumnName(“用户名”);
this.Property(t=>t.PasswordHash).HasColumnName(“PasswordHash”);
this.Property(t=>t.SecurityStamp).HasColumnName(“SecurityStamp”);
this.Property(t=>t.Discriminator).HasColumnName(“Discriminator”);
//关系
}
}
如你所见,这条线表明
本表为ToTable(“配置文件”)
这就是导致问题的原因。更改此选项解决了我的问题。您是否有
配置文件的数据库集
和标识用户
?不,我就是这么说的。IdentityDbContext应该负责我的用户表(我假设它会很乐意使用Profiles,因为我的用户类叫做Profile),但它似乎因为某种原因而崩溃了