このエラーの意味がわかりません。 Visual Studio for Mac 7.5.0 Communityバージョンを使用しています。 ASP.NET CoreのEntity Frameworkで遅延読み込みを使用しています。
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タイプのデバッグ対象のオブジェクトの状態の検査は、このコンテキストではサポートされていません。
Visual Studioデバッガーの式エレベーターから生成されたデバッグとこれが発生した場所を理解したので、デバッガーがタイプSystem.Reflection.MethodBaseのインスタンスからデータをフェッチしようとしたが、そのようなオブジェクトは使用できなかった可能性がありますそのため、そのエラーが発生しました
あなたはレガシーデバッグエンジンを使用して試すことができます、それを修正するかもしれません(ツール->オプション->デバッグ->一般-> "管理互換モードを使用する")
特に、関連するエンティティを取得したい場所では、DBの前のキャッシュに移動するため、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;