Entity framework 如何在实体框架中使用实体原始SQL查询中的数据
我将首先说明我对asp.net核心和实体框架还是非常陌生,但我熟悉ADO和记录集,它似乎是实体框架的基础。我正在努力使用实体框架,因为我能够运行查询,但我不确定如何使用结果,我在网上看到的大多数帮助文档只讨论过程和方法,而不讨论如何使用结果。我正在我的站点上构建登录功能,并开发了以下代码来查询我的UserAccount表中的DB。对于这个登录,我真的只想要用户名、密码和ID,但是我在这个表中有多个字段,这方面我不需要。我是从使用ADO和记录集开始的,所以实际上我更喜欢使用原始sql并确定我想要对这些结果做什么,而不是将它们绑定到一些对象上,而实体框架似乎在很大程度上就是这样做的。我确实很喜欢实体框架的易用性和参数的使用,所以我更喜欢走这条路(不确定这是不是一个坏习惯)。除了我添加到列表时,它开始显示错误“InvalidOperationException:required列'AccessLevel'在'FromSql'操作的结果中不存在”我甚至没有尝试在查询中使用该字段,所以不确定为什么会出现该字段,我使用的是rawsql查询方法,那么为什么它试图查看该表的模型中的内容?最后,这应该返回一条记录,在这种情况下,我想从该记录字段中提取密码值,类似于我在ADO中使用的方式,正如您将在我的passwordhash验证中看到的那样,但我甚至不知道如何从查询结果中提取密码值。谢谢你在这方面的任何帮助,因为我在学习这些东西时感到头疼Entity framework 如何在实体框架中使用实体原始SQL查询中的数据,entity-framework,asp.net-core,Entity Framework,Asp.net Core,我将首先说明我对asp.net核心和实体框架还是非常陌生,但我熟悉ADO和记录集,它似乎是实体框架的基础。我正在努力使用实体框架,因为我能够运行查询,但我不确定如何使用结果,我在网上看到的大多数帮助文档只讨论过程和方法,而不讨论如何使用结果。我正在我的站点上构建登录功能,并开发了以下代码来查询我的UserAccount表中的DB。对于这个登录,我真的只想要用户名、密码和ID,但是我在这个表中有多个字段,这方面我不需要。我是从使用ADO和记录集开始的,所以实际上我更喜欢使用原始sql并确定我想要对
var UserResults = _context.UserAccounts.FromSqlInterpolated($"SELECT USERACCOUNT.USERNAME, USERACCOUNT.PASSWORD, USERACCOUNT.ID,USERACCOUNT.ACCESS_LEVEL FROM DBO.USERACCOUNT WHERE USERACCOUNT.USERNAME={UserName}");
if (UserResults.Count() == 1) //if we have more than 1 result we have security issue so do not allow login
{
var passwordHasher = new PasswordHasher<string>();
var hashedPassword = passwordHasher.HashPassword(null, Password);
var testResults = UserResults.ToList();
if (passwordHasher.VerifyHashedPassword(null, hashedPassword, THIS SHOULD BE VALUE FROM DB RIGHT HERE!!!) == PasswordVerificationResult.Success)
{
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, UserName)
};
var UserResults=_context.UserAccounts.FromSqlInterpolated($“选择USERACCOUNT.USERNAME、USERACCOUNT.PASSWORD、USERACCOUNT.ID、USERACCOUNT.ACCESS_LEVEL FROM DBO.USERACCOUNT WHERE USERACCOUNT.USERNAME={USERNAME}”);
if(UserResults.Count()==1)//如果我们有多个结果,我们就有安全问题,所以不允许登录
{
var passwordHasher=new passwordHasher();
var hashedPassword=passwordHasher.HashPassword(null,Password);
var testResults=UserResults.ToList();
if(passwordHasher.VerifyHashedPassword(null,hashedPassword,这应该是这里DB的值!!!)==PasswordVerificationResult.Success)
{
var索赔=新列表
{
新索赔(ClaimTypes.Name、用户名)
};
我的背景如下:
public partial class LoginDBContext : DbContext
{
public DbSet<UserAccount> UserAccounts { get; set; }
public LoginDBContext(DbContextOptions<LoginDBContext> options) : base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<UserAccount>(entity =>
{
//entity.ToTable("UserAccount");
entity.HasNoKey();
//entity.Property(e => e.Id)
// .HasMaxLength(50)
// .IsUnicode(false);
//entity.Property(e => e.Username)
// .HasMaxLength(50)
// .IsUnicode(false);
//entity.Property(e => e.Password)
// .HasMaxLength(50)
// .IsUnicode(false);
});
}
}
public分部类LoginDBContext:DbContext
{
公共数据库集用户帐户{get;set;}
公共LoginDBContext(DbContextOptions选项):基本(选项)
{
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity(Entity=>
{
//实体。ToTable(“用户账户”);
entity.HasNoKey();
//entity.Property(e=>e.Id)
//.HasMaxLength(50)
//.IsUnicode(假);
//entity.Property(e=>e.Username)
//.HasMaxLength(50)
//.IsUnicode(假);
//entity.Property(e=>e.Password)
//.HasMaxLength(50)
//.IsUnicode(假);
});
}
}
如果不想加载用户表的所有列,可以返回具有所需属性的匿名对象,或者为所需列创建一个类并返回它
var users = _context.UserAccounts
.Where(a => a.UserName == UserName)
.Select(a => new { a.Id, a.UserName, a.Password })
.ToArray();
if (users.Length == 1)
{
var user = users.First();
if (passwordHasher.VerifyHashedPassword(null, hashedPassword, user.Password) == PasswordVerificationResult.Success)
{
// ... your magic
}
}
所以您甚至没有使用fromsqlinterpolated()?是否有一种方法可以使用原始sql(如我的代码)实现这一点?
FromRowSql
希望返回一个实体,因此它要求提供所有列。您说我正在努力使用实体框架,因为您没有按照它的设计使用它。仅为“异常”提供使用FromRawSql
如果你不打算使用静态类型的查询,那么你的斗争将继续下去——寻找其他的ORM框架;)你完全正确,我可能应该强迫自己继续使用它来学习它。我将根据你所说的调整我的代码,但为了进一步理解为什么UserAccount会起作用,我需要调整我的DBF上下文吗我注释掉了ToTable(“UserAccount”),但我假设我应该使用它来创建链接,以便它知道表?另外,您通常会为每个表在同一个文件中创建一个DBContext(即,一个文件中每个表的modelBuilder.Entity).EF将默认使用实体类型名称作为表名,使用ToTable('name')
当表名和类型名不同时。您可以在一个文件中的一个DbContext中配置多个表。啊,明白了。我想ModelBuilder对我来说真的不必要,因为它是完全相同的。只是好奇您对此的看法。如果我非常熟悉SQL,并且在VBA项目中经常使用ADO,您会这样做吗KI更适合于将ADO.NET用于应用程序与数据库通信,或者您认为强制从头开始学习实体框架可能更好吗?