Je ne sais pas ce que signifie cette erreur. J'utilise la version de la communauté Visual Studio pour Mac 7.5.0. J'utilise le chargement paresseux dans Entity Framework avec 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
Modèle d'entité:
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; }
}
Voici le générateur d'entités:
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");
});
Voici le générateur d'entités pour la table utilisateur:
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);
});
Code 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;
}
Classe de mappeur:
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;
}
Fichier de référentiel:
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;
}
Capture d'écran du message d'erreur:
Transcription:
L'inspection de l'état d'un objet dans le débogueur de type System.Reflection.MethodBase n'est pas prise en charge dans ce contexte.
D'après ce que je vous ai compris, où le débogage et cela s'est produit, qui est produit à partir de l'ascenseur d'expression du débogueur Visual Studio, cela peut donc signifier que le débogueur essayait de récupérer les données d'une instance de type System.Reflection.MethodBase mais cet objet n'était pas disponible il a donc produit cette erreur,
vous pouvez essayer d'utiliser le moteur de débogage hérité, vous pouvez le corriger (Outils -> Options -> Débogage -> Général -> "Utiliser le mode de compatibilité géré")
Ne comptez pas sur Find car cela ira dans le cache avant DB, en particulier là où vous souhaitez récupérer les entités liées. De plus, je crois que votre traitement du mot de passe est à l'envers et ne serait pas transmis à EF/SQL en raison de la fonction de déchiffrement. Donc, chiffrez/hachez le mot de passe fourni par l'utilisateur et comparez-le aux données déjà chiffrées/hachées de la base de données.
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;