Я не знаю, что означает эта ошибка. Я использую версию сообщества 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;
}
Снимок экрана с сообщением об ошибке:
Расшифровка:
Inspecting the state of an object in the debuggee of type System.Reflection.MethodBase is not supported in this context.
да. После этого код не выполняется ..
Добавьте код для _adminGenericRepository.FindAsync(), а также всю строку кода из точки останова на изображении: var user = await .... Какое исключение возникает при запуске без точки останова?
добавить полный код. Получение ошибки на SelectedRole = mapRoleDbDataToViewModel (user.RoleAssign! = Null? User.RoleAssign.FirstOrDefault (). Role: null). Из-за этой ошибки
@StevePy - Я обнаружил, что -> Ленивая загрузка не подходит для шаблона Async. Можете ли вы иметь какое-нибудь представление об этой проблеме?





Не полагайтесь на 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;
Что значит «правильный путь»? Об обработке пароля или заполнении модели представления? Не работает?
заполнение модели представления. Я не пробовал ... Так как много кода с таким подходом
Дополнительный шаг для заполнения модели представления (по сравнению с выполнением этого в выражении EF .Select() - это только в том случае, если вам нужно вызвать функцию C# (mapRoleDbDataToViewModel). EF попытается передать эту функцию в SQL Server, который не будет знать об этой функции Вместо этого, если вы можете создать модель представления из связанных данных (user.RoleAssign.Role), вы можете заполнить всю структуру модели представления в одном выражении. Сначала попробуйте, выясните, как заставить его работать, а затем оптимизировать оттуда.
Насколько я понял вас, где произошла отладка, и это происходит из лифта выражений отладчика Visual Studio, поэтому это может означать, что отладчик пытался получить данные из экземпляра типа System.Reflection.MethodBase, но такой объект был недоступен поэтому он произвел эту ошибку,
вы можете попробовать использовать устаревший механизм отладки, возможно, это исправить (Инструменты -> Параметры -> Отладка -> Общие -> «Использовать управляемый режим совместимости»)
Я использую визуальную студию для Mac. Я не нахожу такой вариант, как вы сказали. Я пытался найти этот вариант, но не нашел.
этот блог msdn был моей ссылкой blogs.msdn.microsoft.com/devops/2013/10/16/…, его для vs2013 и работает также для VS2015, пройдите его, возможно, вы пропустили шаг
на самом деле есть другой способ, щелкните правой кнопкой мыши и выберите Свойства вашего проекта, перейдите в «Отладка», затем установите флажок «Включить отладку собственного кода», я думаю, это доступно в vs для Mac
@ZulqarnainJalil, вы все еще получаете то же исключение или оно изменилось? после того, как вы сделали выше
Использование режима совместимости диспетчера решило эту проблему для меня на VS2019 / Win 10.
Эта ошибка останавливает выполнение кода?