首页 > 解决方案 > 字段列表实体框架中的未知列

问题描述

我遇到了这个问题,Visual Studio 调试器会抛出异常

字段列表中的未知列

最近在尝试连接表时发生了这种情况,并且我没有为数据所需的测试用例方法创建关联对象的实例。现在我收到了这个错误,据我所知,不是从加入中得知的。错误是

未知列“u0.ConcurrencyStamp”

在字段列表中,这是服务应该首先在我的用户表上访问的列,没问题。因此,如果是这种情况,我会感觉到 automapper 文件在映射到我发送到前端的对象时只是没有映射并告诉系统此列是此列。

老实说,我认为问题出在此之前,因为我什至还没有到达控制器的映射部分,但是当我实际上从数据库中提取时。这很奇怪,因为所有列在其模型定义中都有其定义的表列名称。

这是我的服务、控制器和映射器配置。以及我的目标带回模型“UserDetailsDto”和我的数据库模型 ApplicationUser

CreateMap<ApplicationUser, UserDetailsDto>()
            .ForMember(dest => dest.CompanyName, opts => opts.MapFrom(src => src.Company.Company_Name))
            .ForMember(dest => dest.Initials, opts => opts.MapFrom(src =>
                String.Concat(
                String.IsNullOrEmpty(src.FirstName) ? String.Empty : src.FirstName.Substring(0, 1),
                String.IsNullOrEmpty(src.LastName) ? String.Empty : src.LastName.Substring(0, 1)
                )
            ))
            .ForMember(dest => dest.FullName, opts => opts.MapFrom(src => src.FirstName + " " + src.LastName))
            .ForMember(dest => dest.ExternalUserTypeName, opts => opts.MapFrom(src => src.UserType.TypeName))
            .ForMember(dest => dest.ExternalUserTypeId, opts => opts.MapFrom(src => src.UserType.ID))
            .ForMember(dest => dest.ConcurrencyStamp, opts => opts.MapFrom(src => src.ConcurrencyStamp));  

服务

public async Task<List<ApplicationUser>> GetMostRecentUsers(int numberOfUsers)
{
    return await _locationDbContext.Users
                                   .Include(nameof(Company))
                                   .Include(nameof(UserType))
                                   .OrderByDescending(user => user.Created)
                                   .Take(numberOfUsers)
                                   .ToListAsync();
}

控制器

public async Task<IActionResult> GetMostRecentUsers(int numberOfUsers)
{
    try
    {
        if (numberOfUsers < 1)
        {
            return BadRequest("Please input a number of users to return");
        }

        var result = await _userService.GetMostRecentUsers(numberOfUsers);

        if (result.Count == 0)
        {
            return NotFound("No users found");
        }

        var userDtos = _mapper.Map<List<ApplicationUser>, List<UserDetailsDto>>(result);

        return Ok(userDtos);
    }
    catch (Exception ex)
    {
        _sentry.Log(Constants.Sentry.Error, ex, _settings.Environment);
        return CreateCustomErrorResponse(ex.Message);
    }
}

目标模型

public class UserDetailsDto
{
    public Guid? Id { get; set; }

    public DateTime Created { get; set; }
    public Guid? CreatedBy { get; set; }
    public DateTime Modified { get; set; }
    public Guid? ModifiedBy { get; set; }

    public Guid CompanyId { get; set; }
    public string CompanyName { get; set; }

    public string UserName { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public string PhoneNumber { get; set; }
    public string Title { get; set; }
    public string Password { get; set; }

    public bool Active { get; set; }
    public bool IsInternalUser { get; set; }

    public int UserRoleId { get; set; }
    public int ExternalUserTypeId { get; set; }
    public string ExternalUserTypeName { get; set; }

    public string Initials { get; set; }
    public string FullName { get; set; }

    public string ConcurrencyStamp { get; set; }

    public UserDetailsDto()
    {
        Active = true;
        UserRoleId = 1; //1 is the default = no role
        ExternalUserTypeId = 1;
    }
}

数据库模型

public class ApplicationUser: IdentityUser<Guid>
{
    [Column("ID")]
    public override Guid Id { get; set; }
    [Column("CREATED")]
    public DateTime Created { get; set; }
    [Column("CREATED_BY")]
    public Guid? CreatedBy { get; set; }
    [Column("MODIFIED")]
    public DateTime Modified { get; set; }
    [Column("MODIFIED_BY")]
    public Guid? ModifiedBy { get; set; }
    [Column("FIRST_NAME")]
    public string FirstName { get; set; }
    [Column("LAST_NAME")]
    public string LastName { get; set; }
    [Column("EMAIL")]
    public override string Email { get; set; }
    [Column("NORMALIZED_EMAIL")]
    public override string NormalizedEmail { get; set; }
    [Column("EMAIL_CONFIRMED")]
    public override bool EmailConfirmed { get; set; }
    [Column("USER_NAME")]
    public override string UserName { get; set; }
    [Column("NORMALIZED_USER_NAME")]
    public override string NormalizedUserName { get; set; }
    [Column("COMPANY_ID")]
    public Guid CompanyId { get; set; }
    [Column("PHONE_NUMBER")]
    public override string PhoneNumber { get; set; }
    [Column("PHONE_NUMBER_CONFIRMED")]
    public override bool PhoneNumberConfirmed { get; set; }
    [Column("TITLE")]
    public string Title { get; set; }
    [Column("ACTIVE")]
    public bool Active { get; set; }
    [Column("INTERNAL_USER")]
    public bool IsInternalUser { get; set; }
    [Column("ROLE_ID")]
    public int UserRoleId { get; set; }
    [Column("TYPE_ID")]
    [ForeignKey("UserType")]
    public int ExternalUserTypeId { get; set; }
    [Column("PASSWORD_HASH")]
    public override string PasswordHash { get; set; }
    [Column("SECURITY_STAMP")]
    public override string SecurityStamp { get; set; }
    [Column("CONCURRENCY_STAMP")]
    public override string ConcurrencyStamp { get; set; }
    [Column("TWO_FACTOR_ENABLED")]
    public override bool TwoFactorEnabled { get; set; }
    [Column("LOCKOUT_END")]
    public override DateTimeOffset? LockoutEnd { get; set; }
    [Column("LOCKOUT_ENABLED")]
    public override bool LockoutEnabled { get; set; }
    [Column("ACCESS_FAILED_COUNT")]
    public override int AccessFailedCount { get; set; }
    public virtual Company Company { get; set; }

    public virtual UserType UserType { get; set; }
}

标签: c#entity-frameworkservicefield

解决方案


推荐阅读