.NET 实体框架自定义用户表和列错误

问题描述 投票:0回答:1

我正在尝试使用自己的表来存储 .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?

.net asp.net-mvc entity-framework
1个回答
0
投票

您在实体框架查找“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);
}

© www.soinside.com 2019 - 2024. All rights reserved.