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

Я не знаю, что означает эта ошибка. Я использую версию сообщества Visual Studio для Mac 7.5.0. Я использую отложенную загрузку в 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;
}

Класс картографа:

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;
}

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

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

Расшифровка:

Inspecting the state of an object in the debuggee of type System.Reflection.MethodBase is not supported in this context.

Эта ошибка останавливает выполнение кода?

Nkosi 27.08.2018 01:46

да. После этого код не выполняется ..

San Jaisy 27.08.2018 01:48

Добавьте код для _adminGenericRepository.FindAsync(), а также всю строку кода из точки останова на изображении: var user = await .... Какое исключение возникает при запуске без точки останова?

Steve Py 27.08.2018 07:35

добавить полный код. Получение ошибки на SelectedRole = mapRoleDbDataToViewModel (user.RoleAssign! = Null? User.RoleAssign.FirstOrDefault (). Role: null). Из-за этой ошибки

San Jaisy 27.08.2018 12:07

@StevePy - Я обнаружил, что -> Ленивая загрузка не подходит для шаблона Async. Можете ли вы иметь какое-нибудь представление об этой проблеме?

San Jaisy 28.08.2018 14:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
21
5
7 841
2

Ответы 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's 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;

Что значит «правильный путь»? Об обработке пароля или заполнении модели представления? Не работает?

Steve Py 30.08.2018 00:53

заполнение модели представления. Я не пробовал ... Так как много кода с таким подходом

San Jaisy 30.08.2018 01:52

Дополнительный шаг для заполнения модели представления (по сравнению с выполнением этого в выражении EF .Select() - это только в том случае, если вам нужно вызвать функцию C# (mapRoleDbDataToViewModel). EF попытается передать эту функцию в SQL Server, который не будет знать об этой функции Вместо этого, если вы можете создать модель представления из связанных данных (user.RoleAssign.Role), вы можете заполнить всю структуру модели представления в одном выражении. Сначала попробуйте, выясните, как заставить его работать, а затем оптимизировать оттуда.

Steve Py 30.08.2018 03:01

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

вы можете попробовать использовать устаревший механизм отладки, возможно, это исправить (Инструменты -> Параметры -> Отладка -> Общие -> «Использовать управляемый режим совместимости»)

Я использую визуальную студию для Mac. Я не нахожу такой вариант, как вы сказали. Я пытался найти этот вариант, но не нашел.

San Jaisy 03.09.2018 01:57

этот блог msdn был моей ссылкой blogs.msdn.microsoft.com/devops/2013/10/16/…, его для vs2013 и работает также для VS2015, пройдите его, возможно, вы пропустили шаг

Wesam 03.09.2018 09:19

на самом деле есть другой способ, щелкните правой кнопкой мыши и выберите Свойства вашего проекта, перейдите в «Отладка», затем установите флажок «Включить отладку собственного кода», я думаю, это доступно в vs для Mac

Wesam 03.09.2018 11:35

@ZulqarnainJalil, вы все еще получаете то же исключение или оно изменилось? после того, как вы сделали выше

Wesam 15.09.2019 11:57

Использование режима совместимости диспетчера решило эту проблему для меня на VS2019 / Win 10.

Kolichikov 30.01.2020 22:03

Другие вопросы по теме