我正在尝试使用自己的表来存储 .NET 4.8.1 实体框架应用程序的用户。我有这个应用程序用户模型:
namespace GesTalento.Models
{
// https://go.microsoft.com/fwlink/?LinkID=317594 para obtener más información.
[Table("Usuario")]
public class Usuario : IdentityUser
{
[Key]
[StringLength(128)]
public string IdUsuario { get; set; }
[Required]
[StringLength(40)]
public string TipoDeUsuario { get; set; }
public int? IdCandidato { get; set; }
[Required]
[StringLength(40)]
public string Nombre { get; set; }
[EmailAddress]
[StringLength(50)]
public string Correo { get; set; }
public bool CorreoConfirmado { get; set; }
public string Contrasena { get; set; }
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<Usuario> manager)
{
// Tenga en cuenta que authenticationType debe coincidir con el valor definido en CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Agregar reclamaciones de usuario personalizadas aquí
return userIdentity;
}
}
}
这个数据库上下文:
namespace GesTalento.Data
{
public class ApplicationDbContext : IdentityDbContext<Usuario>
{
public DbSet<Entrevista> Entrevista { get; set; }
public DbSet<Oferta> Oferta { get; set; }
public DbSet<Candidato> Candidato { get; set; }
public DbSet<Contacto> Contacto { get; set; }
public DbSet<Familia> Familia { get; set; }
public DbSet<Comentario> Comentario { get; set; }
public DbSet<Habilidad> Habilidad { get; set; }
public DbSet<Requisito> Requisito { get; set; }
// public DbSet<Usuario> Usuario { get; set; }
public ApplicationDbContext()
: base("name=GestionTalento")
{
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Usuario>()
.ToTable("Usuario")
// .HasKey(p => p.IdUsuario)
.Ignore(p => p.PhoneNumberConfirmed)
.Ignore(p => p.TwoFactorEnabled)
.Ignore(p => p.LockoutEnabled)
.Ignore(p => p.LockoutEndDateUtc)
.Ignore(p => p.AccessFailedCount)
.Ignore(p => p.EmailConfirmed)
.Ignore(p => p.PasswordHash)
.Ignore(p => p.SecurityStamp)
.Ignore(p => p.PhoneNumber);
// .Ignore(p => p.Claims)
// .Ignore(p => p.Logins)
//.Ignore(p => p.Roles)
modelBuilder.Entity<Usuario>().Property(p => p.Id).HasColumnName("IdUsuario");
modelBuilder.Entity<Usuario>().Property(p => p.Email).HasColumnName("Correo");
modelBuilder.Entity<Usuario>().Property(p => p.UserName).HasColumnName("Nombre");
}
}
}
但是当我尝试登录时,出现以下行
var usuario = await UserManager.FindByNameAsync(model.Correo);
导致此错误
El nombre de columna 'IdUsuario1' no es válido.
El nombre de columna 'Nombre1' no es válido.
El nombre de columna 'Correo1' no es válido.
Descripción: Excepción no controlada al ejecutar la solicitud Web actual. Revise el seguimiento de la pila para obtener más información acerca del error y dónde se originó en el código.
Detalles de la excepción: System.Data.SqlClient.SqlException: El nombre de columna 'IdUsuario1' no es válido.
El nombre de columna 'Nombre1' no es válido.
El nombre de columna 'Correo1' no es válido.
这表示列名无效。为什么实体框架查找 IdUsuario1、Correo1 和 Nombre1?为什么它在列名中添加 1?
您在实体框架查找“IdUsuario1”、“Correo1”和“Nombre1”等列时遇到的问题可能与您使用 .Ignore 方法排除 IdentityUser 基类的某些属性这一事实有关,但是实体框架仍在尝试为它们创建列。
要解决此问题,您可以使用 .Property 方法以更详细的方式配置属性,使实体框架知道您已经处理了它们。以下是更新 OnModelCreating 方法的方法:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Usuario>()
.ToTable("Usuario")
.Property(p => p.Id).HasColumnName("IdUsuario");
modelBuilder.Entity<Usuario>()
.Property(p => p.Email).HasColumnName("Correo");
modelBuilder.Entity<Usuario>()
.Property(p => p.UserName).HasColumnName("Nombre");
// Additional configuration for the properties you want to ignore
modelBuilder.Entity<Usuario>()
.Ignore(p => p.PhoneNumberConfirmed)
.Ignore(p => p.TwoFactorEnabled)
.Ignore(p => p.LockoutEnabled)
.Ignore(p => p.LockoutEndDateUtc)
.Ignore(p => p.AccessFailedCount)
.Ignore(p => p.EmailConfirmed)
.Ignore(p => p.PasswordHash)
.Ignore(p => p.SecurityStamp)
.Ignore(p => p.PhoneNumber);
}