"Проверка состояния объекта в отладчике типа System.Reflection.MethodBase не поддерживается в этом контексте" - программирование
Подтвердить что ты не робот

"Проверка состояния объекта в отладчике типа System.Reflection.MethodBase не поддерживается в этом контексте"

Я не знаю, что означает эта ошибка. Я использую версию Visual Studio для Mac 7.5.0 Community. Я использую ленивую загрузку в Entity Framework с ASP.NET Core.

public partial class AdminUser
{
    public AdminUser()
    {
        RoleAssign = new HashSet<RoleAssign>();
    }

    public Guid UserId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public string UserName { get; set; }
    public byte[] Password { get; set; }
    public DateTime CreatedTimeStamp { get; set; }
    public DateTime? ModifiedTimeStamp { get; set; }
    public DateTime? LogDate { get; set; }
    public short? LogNumber { get; set; }
    public bool ReloadActiveFlag { get; set; }
    public bool IsActive { get; set; }
    public string ExtraText { get; set; }
    public string ResetPasswordToken { get; set; }
    public DateTime? ResetPasswordTokenCreatedTimeStamp { get; set; }

    public virtual ICollection<RoleAssign> RoleAssign { get; set; }
}

Модель сущности RoleAssign:

public partial class RoleAssign
{
    public Guid RoleAssignId { get; set; }
    public Guid RoleId { get; set; }
    public Guid UserId { get; set; }

    public virtual AdminRole Role { get; set; }
    public virtual AdminUser User { get; set; }
}

Вот строитель сущностей:

modelBuilder.Entity<RoleAssign>(entity =>
{
    entity.Property(e => e.RoleAssignId).ValueGeneratedNever();

    entity.HasOne(d => d.Role)
        .WithMany(p => p.RoleAssign)
        .HasForeignKey(d => d.RoleId)
        .OnDelete(DeleteBehavior.ClientSetNull)
        .HasConstraintName("FK__RoleAssig__RoleI__160F4887");

    entity.HasOne(d => d.User)
        .WithMany(p => p.RoleAssign)
        .HasForeignKey(d => d.UserId)
        .OnDelete(DeleteBehavior.ClientSetNull)
        .HasConstraintName("FK__RoleAssig__UserI__17036CC0");
});

Вот построитель сущностей для пользовательской таблицы:

modelBuilder.Entity<AdminUser>(entity =>
{
    entity.HasKey(e => e.UserId);

    entity.Property(e => e.UserId).ValueGeneratedNever();

    entity.Property(e => e.CreatedTimeStamp)
        .HasColumnType("datetime")
        .HasDefaultValueSql("(getdate())");

    entity.Property(e => e.Email)
        .IsRequired()
        .IsUnicode(false);

    entity.Property(e => e.ExtraText).IsUnicode(false);

    entity.Property(e => e.FirstName)
        .IsRequired()
        .IsUnicode(false);

    entity.Property(e => e.IsActive)
        .IsRequired()
        .HasColumnName("isActive")
        .HasDefaultValueSql("((1))");

    entity.Property(e => e.LastName)
        .IsRequired()
        .IsUnicode(false);

    entity.Property(e => e.LogDate).HasColumnType("datetime");

    entity.Property(e => e.ModifiedTimeStamp).HasColumnType("datetime");

    entity.Property(e => e.Password).IsRequired();

    entity.Property(e => e.ResetPasswordToken).IsUnicode(false);

    entity.Property(e => e.ResetPasswordTokenCreatedTimeStamp).HasColumnType("datetime");

    entity.Property(e => e.UserName)
        .IsRequired()
        .IsUnicode(false);
});

Код UOW:

public async Task<UserViewModel> AdminAuthentication(UserViewModel userView)
{
    var user = await _adminGenericRepository.FindAsync(x => x.IsActive && x.UserName.Equals(userView.UserName) && (AesEncryptAndDecrypt.DecryptStringFromBytes(x.Password, crytograpyKey, crytograpyIV).Equals(userView.Password)));

    if (user != null)
    {
        return new UserViewModel
        {
            UserId = user.UserId,
            isActive = user.IsActive,
            UserName = user.UserName,
            LastName = user.LastName,
            FirstName = user.FirstName,
            SelectedRole = mapRoleDbDataToViewModel(user.RoleAssign != null ? user.RoleAssign.FirstOrDefault().Role : null)
        };
    }
    return null;
}

Класс Mapper:

private RoleViewModel mapRoleDbDataToViewModel(AdminRole dbRole)
{
    if (dbRole != null)
    {
        return new RoleViewModel
        {
            RoleId = dbRole.RoleId,
            RoleName = dbRole.RoleName,
            RoleType = dbRole.RoleType,
            SortOrder = dbRole.SortOrder,
            TreeLevel = dbRole.TreeLevel,
            Permissions = GetRuleByRoleId(dbRole.RoleId)
        };
    }
    return null;
}

Файл репозитория:

public virtual async Task<T> FindAsync(Expression<Func<T, bool>> predicate)
{
    return await _entities.Set<T>().SingleOrDefaultAsync(predicate);
}

public IQueryable<T> FindBy(System.Linq.Expressions.Expression<Func<T, bool>> predicate)
{
    IQueryable<T> query = _entities.Set<T>().Where(predicate);
    return query;
}

Снимок экрана с сообщением об ошибке:

error image

Стенограмма:

Проверка состояния объекта в отладчике типа System.Reflection.MethodBase не поддерживается в этом контексте.

4b9b3361

Ответ 1

Из того, что я понял, где была отладка, и это произошло, что создается из лидера выражения отладчика Visual Studio, это может означать, что отладчик пытался извлечь данные из экземпляра, который имеет тип System.Reflection.MethodBase, но такой объект недоступен поэтому он произвел эту ошибку,

вы можете попробовать использовать устаревший отладочный движок, можете его исправить (Инструменты → Параметры → Отладка → Общие → "Использовать управляемый режим совместимости")

Ответ 2

Не полагайтесь на Find, так как это дойдет до кэша перед БД, особенно если вы хотите получить связанные объекты. Кроме того, я считаю, что ваше обращение с паролем обратное и не будет проходить через EF/SQL из-за функции дешифрования. Поэтому шифруйте/хешите предоставленный пароль от пользователя и сравните его с уже зашифрованными/хэшированными данными в базе данных.

string encryptedPassword = AesEncryptAndDecrypt.EncryptString(userView.Password, crytograpyKey, crytograpyIV);
var userData = await _adminGenericRepository.FindBy(x => x.IsActive && x.UserName == userView.UserName && x.Password == encryptedPassword)
    .Select( new     
    {
        UserId = user.UserId,
        IsActive = user.IsActive,
        UserName = user.UserName,
        LastName = user.LastName,
        FirstName = user.FirstName,
        // When using FirstOrDefault, you should have an OrderBy to ensure the selection is predictable.
        SelectedRole = user.RoleAssign.OrderByDescending(x => x.Date).FirstOrDefault()?.Role 
        // Cannot call C# methods here since this will go to SQL.. 
        // If you can populate a UserRoleViewModel in-line, then that can be put here to skip the extra mapping below.
    }).SingleOrDefaultAsync();

// At this point we will have the user details and it selected Role ready for mapping. 
//This assumes that the mapping of the Role does not rely on any child relationships under the Role.
if (userData != null)
    return new UserViewModel
    {
        UserId = userData.UserId,
        IsActive = userData.IsActive,
        UserName = userData.UserName,
        LastName = userData.LastName,
        FirstName = userData.FirstName,
        SelectedRole = mapRoleDbDataToViewModel(userData.SelectedRole)
    };
else
    return null;